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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
ipad上运行python的方法步骤
Oct 12 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
Python线程条件变量Condition原理解析
Jan 20 Python
python实现QQ邮箱发送邮件
Mar 06 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 Python
详解Python为什么不用设计模式
Jun 24 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
javascript奇异的arguments分析
2010/10/20 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
js倒计时显示实例
2016/12/11 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
如何保障Web服务器安全
2014/05/05 面试题
心理学专业毕业生推荐信范文
2013/11/21 职场文书
大专生简历的自我评价
2013/11/26 职场文书
军训心得体会
2013/12/31 职场文书
个人授权委托书
2014/09/15 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
Redis基本数据类型String常用操作命令
2022/06/01 Redis