一、语法分析
1.语法分析器的任务
语法树的构建
if (x>5)
y="hello";
else
z=1;
语法树
2.语法分析–上下文无关文法
上下文无关文法是描述程序语言语法的强有力的数学工具
乔姆斯基文法体系
3型文法:正则文法:词法结构
2型文法:上下文无关文法:语法结构
1型文法:上下文有关文法
0型文法:任意文法
每一个外部文法(大圈)都比内部文法(小圈)表达能力强
举个自然语言处理的例子
自然语言中的句子的典型结构
主语 谓语 宾语
名词 动词 名词
例子:
名词:{羊, 老虎, 草, 水}
动词:{吃, 喝}
句子:
羊 吃 草
羊 喝 水
老虎 吃 老虎
草 吃 老虎
…
对这个例子,我们进行形式化分析:
(S表示句子,->表示推出,N表示名词,V表示动词)
S -> N V N
N -> s(sheep) | t(tiger) | g(grass) | w(water)
V -> e(eat) | d(drink)
我们将其中的大写符号叫做非终结符:{S, N, V}
将小写的符号(单个字符或连续字符或+ 、*等)(名词+谓词)叫做终结符:{s, t, g, w, e, d}
开始符号是:S
上下文无关文法
上下文无关文法 G 是一个四元组:
对于之前给出的上下文无关文法的例子
S -> N V N
N -> s | t | g | w
V -> e | d
最左推导和最右推导
最左推导:每次总是选择最左侧的符号进行替换
即对于上例中的 N V N ,首先替换最左边的 N, 再替换之后最左侧的非终结符 V, 最后替换最有一个非终结符 N
最右推导:每次总是选择最右侧的符号进行替换
原文链接:https://blog.csdn.net/qq_37236745/article/details/83540187
3.分析树和二义性
分析树
-
推导可以表达成树状结构
和推导所用的顺序无关(最左、最有、其他) -
特点:
树中的每个内部节点代表非终结符
每个叶子节点代表终结符
每一步推导代表如何从双亲节点生成他的直接孩子节点为了更好的表示,看一下这个例子
E -> num
| id
| E + E
| E * E
推导出3+4*5的这个句子
E -> E + E 《最左推导 》
-> 3 + E
-> 3 + E * E
-> 3 + 4 * E
-> 3 + 4 * 5
分析树的含义取决于树的后序遍历
二义性文法
- 给定文法G,如果存在句子s,他有两颗不同的分析树,那么称G为二义性文法
- 从编译器的家督,二义性文法存在的问题:
同一个程序会有不同的含义
因此程序运行的结果不唯一 - 解决方案: == 文法的重写==