编译原理(清华大学版)第四、六章
重点:
掌握递归下降LL(1)分析法和表驱动LL(1)分析法
- 语法分析是编译程序的核心。作用是识别由此法分析给出的单词符号串是否是给定文法的正确句子,即是否可以通过语法树得到
-
语法分析程序的输入
Token(单词)序列:词法分析产生的输出,是各个单词都正确的源程序,是一个有限序列
-
语法分析程序的功能
根据文法的规则构造与Token序列相匹配的语法树或说寻找与Token序列相匹配的推导或归约。
-
语法分析程序的输出
语法树或某种表示
符号表管理信息:查找
错误处理信息:定位、报错、恢复、继续编译
自顶向下的语法分析方法
确定的自顶向下分析思想
关键
- 首先要解决从文法的识别符号出发,如何根据当前的输入符号(面对的单词)唯一地确定选用哪条规则替换相应非终结符以便往下推导
一些非常重要的概念
- 首符号集合(FIRST集)定义
设\(G=(V_T,V_N,P,S)\)是上下文无关文法(2型文法)
\(FIRST(\alpha)=\{a|\alpha \overset{*}{\Rightarrow}a\beta ,a\in V_T ,\beta \in V^* \}\)
- 后跟符号集合(FOLLOW集)定义
\(FOLLOW(A)=\{a|S\overset{*}{\Rightarrow} \mu A\beta且a\in V_T,a\in FIRST(\beta),\mu\in V_T^*,\beta\in V^+\}\)
或者 \(FOLLOW(A)=\{a|S\overset{*}{\Rightarrow }\dots Aa\dots ,a\in V_T\}\)
如何解决自顶向下分析的关键问题,即判断是否为确定的自定向下分析,引入\(SELECT\)集
产生式的选择符号集(SELECT集)定义
- 给定上下文无关文法的产生式\(A\rightarrow \alpha ,A\in V_N,\alpha\in V^*\)
- 若\(\alpha \overset{*}{\nRightarrow}\epsilon\),则\(SELECT(A\rightarrow \alpha)=FIRST(\alpha)\)
- 若\(\alpha \overset{*}{\Rightarrow}\epsilon\),则\(SELECT(A\rightarrow \alpha)=(FIRST(\alpha)-\{\epsilon\})\cup FOLLOW(A)\)
一个上下文无关文法是LL(1)文法的充分必要条件
- 对每一个非终结符\(A\)的两个不同产生式,\(A\rightarrow \alpha\),$A\rightarrow \beta $,满足\[SELECT(A\rightarrow \alpha )\cap SELECT(A\rightarrow \beta )= \varnothing \]其中\(\alpha\),\(\beta\)不能同时\(\overset{*}{\Rightarrow}\epsilon\)。
LL(1)文法
-
LL(1)文法的含义是:
-
第一个L表明自顶向下分析是从左向右扫描输入串
-
第二个L表明分析过程总用最左推导;
-
1表明只需向后看一个符号就可决定如何推导,即选择哪个产生式(规则)进行推导。
-