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 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
django用户登录和注销的实现方法
Jul 16 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
python动态进度条的实现代码
Jul 03 Python
10款最好的Python开发编辑器
Jul 03 Python
python实现函数极小值
Jul 10 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Python远程方法调用实现过程解析
Jul 28 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 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中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
python高级特性简介
2020/08/13 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
关于Python错误重试方法总结
2021/01/03 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
护士实习自我鉴定
2013/10/22 职场文书
初中家长寄语
2014/04/02 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python