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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
Python常用的爬虫技巧总结
Mar 28 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
python switch 实现多分支选择功能
Dec 21 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
python批量提交沙箱问题实例
2014/10/08 Python
Python的pycurl包用法简介
2015/11/13 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Pytorch转tflite方式
2020/05/25 Python
python实现控制台输出颜色
2021/03/02 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
法学毕业生自荐信
2013/11/13 职场文书
超市端午节活动方案
2014/01/23 职场文书
文字自荐书范文
2014/02/10 职场文书
开学典礼决心书
2014/03/11 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
培训科主任岗位职责
2014/08/08 职场文书
股份合作协议书
2014/09/10 职场文书
五年级学生期末评语
2014/12/26 职场文书
人口与计划生育责任书
2015/05/09 职场文书