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 相关文章推荐
在Python中使用成员运算符的示例
May 13 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
Python selenium文件上传下载功能代码实例
Apr 13 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
Python二元算术运算常用方法解析
Sep 15 Python
python实现学生通讯录管理系统
Feb 25 Python
python 爬取京东指定商品评论并进行情感分析
May 27 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php批量上传的实现代码
2013/06/09 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
python基础教程之Hello World!
2014/08/29 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
学习自我鉴定
2014/02/01 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
合作意向书格式及范文
2014/03/31 职场文书
安全生产计划书
2014/05/04 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
2014年老干部工作总结
2014/11/21 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
linux目录管理方法介绍
2022/06/01 Servers