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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
python自动12306抢票软件实现代码
Feb 24 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
基于pip install django失败时的解决方法
Jun 12 Python
python scipy求解非线性方程的方法(fsolve/root)
Nov 12 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python 操作hive pyhs2方式
Dec 21 Python
对python中list的五种查找方法说明
Jul 13 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 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
php防攻击代码升级版
2010/12/29 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python运用于数据分析的简单教程
2015/03/27 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
人事部主管岗位职责
2013/12/26 职场文书
国培计划培训感言
2014/03/11 职场文书
环保专项行动方案
2014/05/12 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技