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抓取网页图片并放到指定文件夹
Apr 24 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
python调用动态链接库的基本过程详解
Jun 19 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 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
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
javascript中的隐式调用
2018/02/10 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
wxpython绘制音频效果
2019/11/18 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
领导干部考察材料
2014/02/08 职场文书
事业单位考察材料范文
2014/12/25 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
单位工资证明范本
2015/06/12 职场文书