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中常见的数据类型小结
Aug 29 Python
浅谈Python中range和xrange的区别
Dec 20 Python
python版微信跳一跳游戏辅助
Jan 11 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 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自动验证失败的解决方法
2011/06/09 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
Python数据结构之翻转链表
2017/02/25 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
python实现文字版扫雷
2020/04/24 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
python可以用哪些数据库
2020/06/22 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
索桥的故事教学反思
2014/02/06 职场文书
小学信息技术教学反思
2014/02/10 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
校园广播稿100字
2014/10/06 职场文书
个园导游词
2015/02/04 职场文书
护士先进个人总结
2015/02/13 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
粗暴解决CUDA out of memory的问题
2021/05/22 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang