Python的词法分析与语法分析


Posted in Python onMay 18, 2013

词法分析(Lexical Analysis):分析由字符组成的单词是否合法,如果没有问题的话,则产生一个单词流。

语法分析(Syntactic Analysis):分析由单词组成的句子是否合法,如果没有问题的话,则产生一个语法树。

在词法分析器分析源代码文本的时候,有一个概念需要明确:

1.物理行:由回车字符序列(在Windows上是CR LF,在Unix上是LF)结尾的字符序列组成一个物理行。

2.逻辑行:由一个或者多个物理行组成,可以明确地使用反斜杠(\)来连接多个物理行使之成为一个逻辑行;或者,处在圆括号,中括号,花括号内的表达式可以跨越多个物理行,但是被当作一个逻辑行。

词法分析器是面向逻辑行的,也就是说,对于词法分析器而言,只有逻辑行才算是一行,它只在逻辑行结束之处才产生NEWLINE这个单词或者说token。

对于每一处缩进,不管它有多少个空白字符,词法分析器只会产生一个INDENT单词或者说token,代表缩进一级,每当要退出一级缩进的时候,词法分析器就会产生一个DEDENT单词或者说token。注意,单词DEDENT并没有一个或一组字符与之对应,它是完全的逻辑概念。

Python使用稍作修改的BNF(巴科斯范式)来表示词法与语法规则。

下面重点说一下需要注意的地方,以避免发生一些低级但是隐蔽的编程错误。

1.标识符是区分大小写的,但是仍然不要仅仅用大小写不同来区分两个变量。

2.不要使用那些在其它编程语言中是关键字的标识符作为变量名,因为它们很可能会成为Python的关键字。

3.不要使用Python明确声明有特殊意义的标志符作为变量名(这类变量一般以下划线开头),除非明确自己要使用那个特殊含义。

4.不要在Python中使用$和?(字符串中除外),它们不是合法的字符。

5.不要混用Tab和空格来表示缩进,只使用其中一种,并养成习惯。

6.整数字面常量有10,16,8,2几种表示方法,如果使用16进制,请写0xa或者0Xa;如果使用8进制,请写0o7或者0O7;如果使用2进制,请写0b1或者0B1;总之,不要省略掉那个标识进制的字母,建议只使用小写字母。

7.在整数字面常量后加一个l或者L就形成了一个长整数,建议只使用L,因为小写l看起来像数字1.

8.整数使用32位表示,但是长整数并不限于多少位表示,在内存允许的情况下,它可以表示任意大小的整数,这与C语言等是不一样的。

9.如果一个整数字面常量的值超过32位整数的表示范围,那么Python会自动将它升级为长整数,但是在早期的Python实现中可能并非如此,因此如果你预计需要一个很大的整数值,请明确使用长整数。

10.浮点数字面常量只有10进制形式。

Python 相关文章推荐
35个Python编程小技巧
Apr 01 Python
python 异常处理总结
Oct 18 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
关于python中的xpath解析定位
Mar 06 Python
python IDLE添加行号显示教程
Apr 25 Python
利用Python批量识别电子账单数据的方法
Feb 08 Python
简单文件操作python 修改文件指定行的方法
May 15 #Python
Python代理抓取并验证使用多线程实现
May 03 #Python
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 #Python
Python的lambda匿名函数的简单介绍
Apr 25 #Python
python批量下载图片的三种方法
Apr 22 #Python
如何运行Python程序的方法
Apr 21 #Python
python读取注册表中值的方法
Apr 08 #Python
You might like
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
wxPython事件驱动实例详解
2014/09/28 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
python组合无重复三位数的实例
2018/11/13 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
关爱留守儿童倡议书
2014/04/15 职场文书
入职担保书范文
2014/05/21 职场文书
公司股东合作协议书
2014/09/14 职场文书
民间借贷协议书范本
2014/10/01 职场文书
店铺转让协议书
2014/12/02 职场文书
家长会感言
2015/08/01 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
如何理解PHP核心特性命名空间
2021/05/28 PHP