LOADING

加载过慢请开启缓存 浏览器默认开启

编译技术

2025/10/7 Tech BUAA

文法

规范推导=最右推导

句型:由识别符号经过0次或多次推导得到,成分随意。一切东西都是句型

句子:由识别符号经过1次或多次推导得到,且完全由终结符构成

语言:所有句子的集合

短语:句型中,可以由前面句型中的某个非终结符通过1次或多次所能推出的符号串。短语必须得是前面某个非终结符推出的完整符号串,而不能是其一部分

e.g.

文法G[<无符号整数>],w = <数字串>1是该文法的句型

<无符号整数> => <数字串> => <数字串><数字> => <数字串>1

在这个例子中,<数字串>不是短语,因为前面的<数字串>推导出的完整符号串是<数字串>1

简单短语:句型中,能由前面某个非终结符一步推导得到的符号串

句柄:最左简单短语

左递归的消除

左递归文法有一个左递归产生式,一个非左递归产生式

左递归产生式本质上是说在符号串右侧可以无限地添加某些成分,非左递归产生式则说明了符号串最左侧必须是某些成分

消除左递归的思想非常简单:左递归和右递归都可以创造无限的符号串,只需要将最左侧的成分单独提取出来,无限符号串的部分可以用一个右递归来代替

e.g.

A -> Ab | a A的最左侧必须是a,后面可以无限添加b,转换成

A -> aB

B -> aB | ε

语法树

如果不在边上标序号,那么语法树实际上失去了推导时的顺序信息。

使用语法树找短语:若某子树的末端结点按自左向右顺序为句型中的符号串,则该符号串为该句型的相对于该子树根的短语

简单短语:找到短语后,其中通过该子树一次推导就能得到的就是简单短语

句柄:语法树最左侧的简单短语

语法树与二义性

若对于一个文法的某一句子存在两棵不同的语法树, 则该文法是二义性文法,否则是无二义性文法。

对于无二义性文法,因为语法树不包含顺序信息,无论用什么顺序推导,语法树都是相同的。即,无二义性文法只有一棵语法树

词法分析

状态图

左线性文法:::=右侧的非终结符一定在左边

换言之,非终结符可以在右侧添加某些终结符。这符合我们读句型时从左到右的习惯,状态图应运而生

image-20251007220512098

顶层状态就是终止状态

识别一个字符串是否是句子:

image-20251007220944537

上图可以由下面这句话概括:状态图和推导为互逆过程,如果一个字符串不能回到终止状态,说明它不能由开始符号推导得到,则它不是句子

程序设计

由状态图的思想,我们可以设计词法分析程序:

image-20251007221734602