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切片用法实例教程
Sep 08 Python
python自定义解析简单xml格式文件的方法
May 11 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
查看python下OpenCV版本的方法
Aug 03 Python
Python生成器generator用法示例
Aug 10 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python实现烟花小程序
Jan 30 Python
详解python中的hashlib模块的使用
Apr 22 Python
python解析yaml文件过程详解
Aug 30 Python
Python制作词云图代码实例
Sep 09 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
Python是怎样处理json模块的
Jul 16 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递归列出所有文件和目录的代码
2008/09/10 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
Laravel下生成验证码的类
2017/11/15 PHP
零基础php编程好学吗
2019/10/11 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
快速了解Python中的装饰器
2018/01/11 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
SQL Server笔试题
2012/01/10 面试题
药剂专业学生求职信范文
2013/12/28 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
2019各种承诺书范文
2019/06/24 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫