Python的词法分析与语法分析
词法分析(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中with语句的用法
引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 术
-
详解Python中的循环语句的用法
一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句. 二.详解 1.if语句 Python中的if子句由三部分组成:关键字本身.用于判断结果真假的条件表达式以及当表达式为真或者非零时执行的代码块.if 语句的语法如下: if expression: expr_true_suite if 语句的expr_true_suite代码块只有在条件表达式的结
-
简单谈谈python中的语句和语法
python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句中,多条语句组成代码块,多个代码块再组成一整个程序.python的核心其实是由语句和表达式组成.所以在这里简单探讨一下python中的语句和表达式. 因为以后可能会接触到两个版本的python,所以这里讲一讲python2与python3的语句差异: 1.python2中没有nolocal语句. 2.prin
-
Python的词法分析与语法分析
词法分析(Lexical Analysis):分析由字符组成的单词是否合法,如果没有问题的话,则产生一个单词流. 语法分析(Syntactic Analysis):分析由单词组成的句子是否合法,如果没有问题的话,则产生一个语法树. 在词法分析器分析源代码文本的时候,有一个概念需要明确: 1.物理行:由回车字符序列(在Windows上是CR LF,在Unix上是LF)结尾的字符序列组成一个物理行. 2.逻辑行:由一个或者多个物理行组成,可以明确地使用反斜杠(\)来连接多个物理行使之成为一个逻辑行:
-
使用Python编写一个最基础的代码解释器的要点解析
一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解.我们编写的程序源代码实际上就是一串字符序列,编译器或者解释器可以直接理解并执行这个字符序列,这看起来实在是太奇妙了.本文会用Python实现一个简单的解析器,用于解释一种小的列表操作语言(类似于python的list).其实编译器.解释器并不神秘,只要对基本的理论理解之后,实现起来也比较简单(当然,一个产品级的编译器或解释器还是很复杂的). 这种列表语言支持的操作: veca = [1,
-
用Python编写一个简单的Lisp解释器的教程
本文有两个目的: 一是讲述实现计算机语言解释器的通用方法,另外一点,着重展示如何使用Python来实现Lisp方言Scheme的一个子集.我将我的解释器称之为Lispy (lis.py).几年前,我介绍过如何使用Java编写一个Scheme解释器,同时我还使用Common Lisp语言编写过一个版本.这一次,我的目的是尽可能简单明了地演示一下Alan Kay所说的"软件的麦克斯韦方程组" (Maxwell's Equations of Software). Lispy支持的Scheme
-
python开发一个解析protobuf文件的简单编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ply使用 简介 如果你不是从事编译器或者解析器的开发工作,你可能从未听说过ply.ply是基于python的lex和yacc,而它的作者就是大名鼎鼎Python Cookbook, 3rd Edition的作者.可能有些朋友就纳闷了,我一个业务开发怎么需要自己写编译器呢,各位编程大牛说过,中央决定
-
90分钟实现一门编程语言(极简解释器教程)
本文介绍了如何使用 C# 实现一个简化 Scheme--iScheme 及其解释器. 如果你对下面的内容感兴趣: 实现基本的词法分析,语法分析并生成抽象语法树. 实现嵌套作用域和函数调用. 解释器的基本原理. 以及一些 C# 编程技巧. 那么请继续阅读. 如果你对以下内容感兴趣: 高级的词法/语法分析技术. 类型推导/分析. 目标代码优化. 本文则过于初级,你可以跳过本文,但欢迎指出本文的错误 :-) 代码样例 public static int Add(int a, int b) { retu
-
深入解析PHP底层机制及相关原理
1.PHP是什么? PHP 指的是我们从外面看到的一套完整的系统.这听起来有点糊涂,但其实并不复杂(PHP4 内部结构图).从功能上来分:我们可以分为三部分: 1. 解释器部分(Zend 以引擎),负责对输入代码的分析.翻译和执行: 2. 功能性部分(PHP功能函数以及扩展),负责具体实现语言的各种功能(比如它的函数等等): 3. 接口部分(SAPI),负责同 WEB 服务器的会话等功能. Zend包括了第一部分的全部和第二部分的局部,PHP内核 包括了第二部分的局部和第三部分的全部.他们合起来
-
详解静态分析技术符号执行
1. 引言 程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析.语法分析.控制流.数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性.安全性.可靠性.可维护性等指标的一种代码分析技术[8]. 程序静态分析的历史几乎与程序的历史一样长, 自从有了程序就有了程序分析.特别是随着编译技术的发展,大大带动了程序的自动分析技术.目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行.抽象解释.值依赖分析等等
-
javascript 词法作用域和闭包分析说明
复制代码 代码如下: var classA = function(){ this.prop1 = 1; } classA.prototype.func1 = function(){ var that = this, var1 = 2; function a(){ return function(){ alert(var1); alert(this.prop1); }.apply(that); }; a(); } var objA = new ClassA(); objA.func1(); 大家应
-
使用Sphinx对索引进行搜索
Sphinx对索引进行搜索主要分为以下几步:1.用户输入查询语句. 2.对查询语句进行词法分析,语法分析,及语言处理. 3.搜索索引,得到符合语法树的文档. 4.根据得到的文档和查询语句的相关性,对结果进行排序.
-
C/C++程序编译流程详解
程序的基本流程如图: 1.预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同. 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 ①将所有的"#define"删除,并且展开所有的宏定义 ②处理所有的条件编译指令,如:"#if"."#ifdef"."#elif"."#els
随机推荐
- Python探索之创建二叉树
- 简单的Html转换UBB的程序
- 在Tomcat服务器下使用连接池连接Oracle数据库
- 跟着Jquery API学Jquery之一 选择器
- EasyUI创建人员树的实例代码
- JAVA四种基本排序方法实例总结
- 脚本编程 4 驱动器
- 完美卸载Oracle数据库
- ASP.NET设计网络硬盘之查看文件夹实现代码
- 自编函数解决pathinfo()函数处理中文问题
- 解读堆排序算法及用C++实现基于最大堆的堆排序示例
- MySQL SELECT同时UPDATE同一张表问题发生及解决
- vue.js树形组件之删除双击增加分支实例代码
- 详解WordPress开发中的get_post与get_posts函数使用
- Android实现类似网易新闻选项卡动态滑动效果
- 实现两个文本框同时输入的实例
- 非常漂亮的让背景如此暗淡(一种弹出提示信息时页面背景色调改变的方法)
- PHP中cookie和session的区别实例分析
- android 使用uinput模拟输入设备的方法
- Shell中字符串排序的几种方法