语法分析和自底向上语法分析
思维导图
总结
语法分析的功能和任务
- 功能:根据文法规则,从源程序单词符号串中识别出语法成分,并进行语法检查
- 基本任务:识别符号串S是否为某语法成分
自顶向下分析算法的基本思想
- 基本思想:
- 例题:
- 一般过程:
给定符号串S,若预测是某一语法成分,则可根据该语法成分的文法,设法为S构造一棵语法树,若成功,则S最终被识别为某一语法成分,即
其中G[Z]为某语法成分的文法。若不成功, 则
- 特点:
1、分析过程是带预测的,对输入符号串要预测属于什么语法成分,然后根据该语法成分的文法建立语法树。
2、分析过程是一种试探过程,是尽一切办法(选用不同规则) 来建立语法树的过程, 由于是试探过程, 难免有失败, 所以分析过程需进行回溯, 因此也称这种方法是带回溯的自顶向下分析方法。
3、最左推导可以编写程序来实现, 但带回溯的自顶向下分析方法在实际上价值不大, 效率低。 - 主要方法:
1、递归子程序法
2、LL分析法 - 主要问题:
1、左递归问题
2、回溯问题
自顶向下语法分析中,消除左递归和回溯
消除左递归文法
消除直接左递归
- 扩充BNF表示法来改写文法:
规则一(提因子)
若:U∷=xy|xw|….|xz
则可改写为:U∷=x(y|w|….|z)
若:y=y1y2, w=y1w2
则U∷=x(y1(y2|w2)|….|z)
规则二
若有文法规则:U∷=x|y|……|z|Uv
- 将左递归规则改为右递归规则
规则三
- 总结
消除 一般左递归
- 把G的非终结符整理成某种顺序A1, A2, ……An, 使得:
A1 ::= δ1|δ2|……|δk
A2 ::= A1 r……
A3 ::= A2u | A1v……
……. - For i:=1 to n do
begin
for j:=1 to i-1 do
把每个形如Ai∷=Ajr的规则替换成
Ai ∷=(δ1|δ2|……|δk) r ,
其中Aj ∷=δ1|δ2|……|δk是当前全部Aj 的规则;
消除Ai规则中的直接左递归
end - 化简由2得到的文法
- 例题
回溯问题
- 消除回溯的途径:
1、改写文法
对具有多个右部的规则反复提取左因子
2、超前扫描
当文法不满足避免回溯的条件时,即各选择的首符号相交时,可以采用超前扫描的方法,即向前侦察各输入符号串的第二个、第三个符号来确定要选择的目标 - 充分必要条件:
自底向上分析算法的基本思想
- 基本思想:
- 主要方法:
1、算符优先分析法
2、LR分析法 - 主要问题:
句柄的识别问题
递归下降分析法
- 具体做法:
对语法的每一个非终结符都编一个分析程序,当根据文法和当时的输入符号预测到要用某个非终结符去匹配输入串时,就调用该非终结符的分析程序 - 具体过程:
1、
2、
3、算法框图/编写非终结符的分析函数
非终结符号的分析子程序的功能是:用规则右部符号串去匹配输入串
Z∷=‘(’U‘)’|aUb子程序:
U∷=(dZ|e){d}子程序:
- 例子: