编译原理23.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.2 单词的描述工具
1、正规文法
3型文法的定义:设G= (VN,VT,P,S),若P中的每个产生式的 形式都是AaB或Aa,其中A和B都是非终结符,a是终 结符,则G是3型文法或正规文法。 正规方法所描述的是VT*上的正规集。
程序语言中的几类单词的描述:
<标识符>l|l<字母数字> <字母数字>l|d|l<字母数字>|d<字母数字> <无符号整数>d|d<无符号整数> <运算符>+|-|*|/|=|<<等号>|><等号>…… <等号>= <界符>,|;|(|)|……
编译原理 第四章
词法分析
词法分析的任务: 从左至右逐个字符地对源程序进行扫描,产生
一个个单词序列。
4.1 词法分析程序的设计
1、词法分析程序与语法分析程序的接口方式
词法分析工作可以是独立的一遍,把字符流的源程序 变为单词序列,输出在一个中间文件上,这个文件作 为语法分析程序的输入而继续编译过程。
设r,s,t为正规式,则它们服从的代数规律有:
wenku.baidu.com
1、 r|s = s|r 2、r|(s|t)=(r|s)|t 3、r(st)=(rs)t 4、r(s|t)=rs|rt
(s|t)r=sr|tr 5、εr=rε=r
交换律 结合律 结合律 分配律
空律
3、正规文法到正规式
一个正规语言可以由正规文法定义,也可以由正规式定义, 对任意一个正规文法,存在一个定义同一个语言的正规式; 反之,对每个正规式,存在一个生成同一语言的正规文法。
(4)运算符 如:算术运算符:+、-、*、/ 逻辑运算符:<= ,AND OR等
(5)界符: 如, ; () 。等
词法分析的输出结果常采用二元式表示。 即(单词种别,单词自身的值)
例子:if i=5 then x:=y;
保留字if (3,’if’)
标识符i
(1,指向i的符号表入口)
等号=
(4,‘=’)
代入S,得到:S=a(a|d)*(a|d)|a=a((a|d)*(a|d)|ε)=a(a|d)*
4.3 有穷自动机
有穷自动机(也称为有限自动机),作为 一种识别装置,它能准确地识别正规集, 即识别正规文法所定义的语言和正规式 所表示的集合。
B(a|d)B a ε
(2)将正规文法转换成正规式。 与上面过程相反。
•对于AxB,By 转为: A=xy
•对于AxA|y
转为: A=x*y
•对于Ax,Ay 转为: Ax|y
例4.5 文法G[S] SaA Sa AaA AdA Aa Ad
先有:SaA|a, A(aA|dA)|(a|d)
将A式变为:A(a|d)A|(a|d),根据规则娈为: A(a|d)*(a|d)
其中l表示a----z,d表示0----9
无符号实数的描述
如: 25.55e+5 和2.1
例4.1
<无符号数>d<余留无符号数>|.<十进小数>|e<指数部分> <余留无符号数>d<余留无符号数>|.<十进小数>|e<指数部分>|ε <十进小数>d<余留十进小数> <余留十进小数>e<指数部分>|d<余留十进小数>| ε <指数部分>d<余留整指数>|s<整指数> <整指数>d<余留整指数> <余留整指数>d<余留整指数>| ε
(1)将∑上的一个正规式转换成文法G。令其中的VT= ∑, 确定产生式和VN的元素用如下办法:
•对任何正规式r,选择一个非终结符S生成产生式Sr,并
将S定为G的识别符号。
•若x和y都是正规式,对形如Axy的产生式,重写成:
AxB,By两产生式,其中B是新选择的非终结符。
•对已转换的文法中形如Ax*y的产生式重写为:
例4.2 令∑={a,b}, ∑上的正规式和相应的正规集的例子有:
正规式 a a|b ab (a|b)(a|b) a* (a|b)* (a|b)*(aa|bb)(a|b)*
正规集
{a} {a,b} {ab} {aa,ab,ba,bb} (ε,a,aa,aaa……) {ε,a,b,aa,bb,abaa……} {∑*上所有含有两个相继的a 或两个相继的b组成的串}
常数5
(2,‘5’)
保留字then (3,’then’)
标识符x (1,指向x的符号表入口)
赋值符号::= (4,‘::=’)
标识符y (1,指向y的符号表入口)
分号;
(5,‘;’)
将词法分析工作进行分离的考虑 1、使整个编译程序的结构更简洁、清晰和条理化。 2、编译程序的效率会改进。 3、增强编译程序的可移植性。
例4.3 令∑={d,.,e,+,-},则∑上的正规式
d*(.dd*|ε)(e(+|-|ε)dd*|ε) 表示的是无符号数。
如:2,12,59,3.6e2,471.88e-1
若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价, 写作e1=e2.
如e1=a|b,e2=b|a,则e1=e2
其中:S表示+,-
2、正规式与正规集
正规集的定义: 设字母表为∑,辅助字母表∑‘={Ф,ε,|,.,*,(,)}。
1、 Ф和ε都是∑上的一个正规式,它所表示的正规集分 别为{Ф}和{ε};
2、任何a∈∑, a是∑上的一个正规式,它所表示的正规 式为{a};
3、假定e1和e2都是∑上的正规式,它们所表示的正规集分 别是L(e1),L(e2),那么(e1),e1|e2,e1*e2,和e1*也都是正规式, 它们所表示的正规集分别为:L(e1)和L(e1) ∪L(e2), L(e1)L(e2),和(L(e1))* 4、仅由有限次使用上述三步骤而定义的表达式才是∑上的 表达式,仅由这些正规式所表示的字集才是∑上的正规集。
AxB, Ay,
BxB,
By
•对形如Ax|y的产生式,重写为:
Ax,
Ay
例4.4 将R=a(a|d)*转换成相应的正规文法。
首先令S是开始符,可写出:Sa(a|d)
形成: SaA
A(a|b)*
对A (a|b)*产生式:A(a|d)B, B ε
最后形式: SaA, BaB,
AaB, BdB,
Aε,
AdB, Bε
更一般的情况,将词法分析程序设计成一个子程序, 每当语法分析程序需要一个单调用该词法分析程序。
2、词法分析程序的输出
(1)基本字(关键字) 如:begin,end,if,while,const,var等
(2)标识符 如:常量名、变量名、过程名等
(3)常数 如:25,3,1415927,TRUE,“ABC”等