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增量循环删除MySQL表数据的方法
Sep 23 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
python @property的用法及含义全面解析
Feb 01 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python使用字典的嵌套功能详解
Feb 27 Python
简单分析python的类变量、实例变量
Aug 23 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
python 实时调取摄像头的示例代码
Nov 25 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
python在package下继续嵌套一个package
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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
学习ExtJS form布局
2009/10/08 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
js实现导航跟随效果
2018/11/17 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
pyside写ui界面入门示例
2014/01/22 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
Python之字典添加元素的几种方法
2020/09/30 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
商务英语应届生自我鉴定
2013/12/08 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技