编译原理学习之语法分析

1、语法分析的地位
–是编译程序的核心部分。
2、语法分析的任务
–识别由词法分析得出的单词序列是否是给定文法的句子。
3、语法分析的理论基础
–上下文无关文法和下推自动机
4、语法分析的方式
1)自上而下语法分析
•反复使用不同产生式进行推导以谋求与输入符号串相匹配。
2)自下而上语法分析
•对输入符号串寻找不同产生式进行归约直到文法开始符号。

4.1下推自动机(PDA)

编译原理学习之语法分析_第1张图片
1)PDA和FA的模型相比,多了一个下推栈。
2)PDA的动作由三个因素来决定:当前状态、读头所指向符号、下推栈栈顶符号。
3)一个输入串能被PDA所接受,仅当输入串读完,下推栈变空;或输入串读完,控制器到达某些终态。
4)正规文法和有限自动机仅适合于描述和识别高级语言的各类单词,语句可用上下文无关文法来描述,而下推自动机又恰好能识别上下文无关文法所能描述的语言,因此上下文无关文法及其对应的下推自动机就成为编译技术中语法分析的理论基础。

4.2自上而下分析法

1.自上而下语法分析定义

–从文法的开始符号开始,反复使用不同产生式进行推导以谋求与输入符号串相匹配。

2.算法

(1)若栈顶符号x是非终结符,查询语法表,找出一个以x作为左部的产生式,x出栈,并将其右部反序入栈,且输出带记下产生式编号——推导。
(2)若栈顶符号x是终结符,且读头下的符号也是x,则x出栈,读头指向下一个符号——匹配。
(3)若栈顶符号x是终结符,但读头下的符号不是x,则匹配失败。这说明可能前面推导时选错了候选式,退回到上次推导现场(包括栈顶符号、读头的指针和输出带上信息)——回溯。
(4)回溯后选取另一候选式进行推导,若没有候选式可选,则进一步回溯。若回溯到开始符号又已无候选式可选,则识别失败。
(5)若栈内仅剩下“#”,且读头也指向“#”,则识别成功。

3、带回溯的自上而下分析法的缺陷

1)如果文法存在左递归,语法分析会无限循环下去。
–左递归:文法存在产生式P →Pa–直接左递归:P →Pa–间接左递归:P →Aa, A→Pb
2)若产生式存在多个候选式,选择哪个进行推导完全是盲目的。
3)回溯会引起时间和空间的大量消耗。
4)如果被识别的语句是错的,算法无法指出错误的确切位置。(目前的编译器是可以找到确切位置的)

4.消除直接左递归

设有文法G=(VN, VT,P,S),其中产生式P为P →Pα|β, α∈V+,β∈V+且β不以P开头
将它转换为等价式:P →βP’P’→αP’|ε
一般地:
将P →P α1| P α2|…. |P αm|β1| β2|….| βn
转换为:P →β1P| β2p|……| βnP
P’ →α1P
| α2P|……| αmP| ε
转换前后等价。因为最终 p=βααααααα。。两种结果一样
例:文法G: (1)E →E+T|T
转化为G:
(1) →E →TE
E→+TE| ε
就是直接变量代换。

5.消除左递归算法

1)把文法G的所有非终结符按任意顺序排列成P1,P2,…,Pn,然后按此顺序执行步骤2。
2)For (I=1,I<=n,I++)
{for (k=1,k<=I-1,k++)
{把形如Pi→Pkγ的规则改写为
Pi→δ1 γ|δ2 γ|……| δn γ
/* 其中Pk→δ1| δ2|……| δn*/ }
消除Pi规则的直接左递归;}
3)删去从文法开始符号不可达的非终结符产生式。

6.消除回溯

1)产生回溯的原因
进行推导时,若产生式存在多个候选式,选择哪个候选式进行推导存在不确定性。
2)消除回溯的基本原则
对文法的任何非终结符,若能根据当前读头下的符号,准确的选择一个候选式进行推导,那么回溯就可以消除。
注:之所以会产生回溯是因为在推导匹配的过程中存在虚假匹配。
3)消除回溯的方法
预测与提左因子
4)预测
根据读头下符号选择候选式,使其第一个符号与读头下符号相同,或该候选式可推导出的第一个符号与读头下符号相同。这相当于向前看了一个符号,所以称为预测。

你可能感兴趣的:(编译原理)