美文网首页
【编译原理】第四章:语法分析

【编译原理】第四章:语法分析

作者: littlefogcat | 来源:发表于2021-01-12 12:06 被阅读0次

一、自顶向下分析概述

从分析树的根节点到叶节点方向构造分析树。
即从开始符号S推导出词串w的过程。

例:


自顶向下分析

最左推导、最右规约

总是选择每个句型的最左非终结符进行替换。

最左推导、最右规约

最右推导、最左规约

总是选择每个句型的最右非终结符进行替换。

最右推导、最左规约

在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为规范规约,对应的最右推导称为规范推导

最左推导、最右推导的唯一性

最左推导、最右推导具有唯一性。

自顶向下的语法分析采用最左推导方试,总是选择每个句型的最左非终结符进行替换。

自顶向下语法分析的通用形式

由一组过程组成,每一个过程对应一个非终结符
从文法开始符号S开始,递归调用文法中的其他非终结符,最终扫描整个输入串,完成分析。

void A() {
  选择一个A产生式,A->X1X2...Xn
  for(i = 1 to k) {
    if (Xi是一个非终结符) {
      递归调用Xi();
    } else if (Xi等于当前输入符号a) {
      读入下一个符号;
    } else 发生一个错误;
  }
}

如果其间有不唯一的产生式,就可能需要退回上一步重新尝试的情况,称为回溯

预测分析

预测分析递归下降分析技术的一个特例,通过输入中向前看固定个数的符号选择正确的产生式。
如果一个文法可以构造出向前看k个符号的预测分析器,称为LL(k)文法

预测分析不需要回溯,具有确定性。

二、文法转换

含有A\rightarrow A\alpha形式产生式的文法称为是直接左递归的。
如果一个文法中有一个非终结符A使得对某个串存在推导 A\rightarrow^+A\alpha,那么这个文法是左递归的。其中,经过两步或以上推导产生的左递归,称为间接左递归的。
左递归会使递归下降分析器陷入无限循环。

左递归

消除直接左递归

文法G=A\rightarrow A \alpha | \beta
r=\beta\alpha^*
该文法是直接左递归的,会陷入无限循环。

将以上文法转换为:
A\rightarrow \beta A'
A'\rightarrow \alpha A' | \epsilon
即可消除左递归。事实上,这个过程把左递归转换成了右递归。

消除直接左递归的一般形式

消除直接左递归的一般形式

消除间接左递归

使用代入法。


消除间接左递归

消除左递归算法

消除左递归算法

提取左公因子

对于一个文法,通过改写产生式来推迟决定,等获得足够多的输入信息再做正确的决定。

例:文法:
\begin{aligned} G: \ &S \rightarrow aAd|aBe \\ &A \rightarrow c \\ &B \rightarrow b \\ \end{aligned}
可以改写为:
\begin{aligned} G: \ &S \rightarrow aS' \\ &S' \rightarrow Ad|Be \\ &A \rightarrow c \\ &B \rightarrow b \\ \end{aligned}

三、LL1文法

预测分析法的工作过程

从文法的开始符号S开始,每一步推导根据当前句型的最左非终结符A和当前输入符号α,选择正确的A-产生式。为保证分析的确定性,选出的候选式必须是唯一的。

S_文法(简单的确定型文法)

  • 每个产生式的右部都以终结符开始;
  • 同一非终结符的各个候选式的首终结符都不同;
  • S_文法不含ε产生式。

非终结符的后继符号集(FOLLOW)

可能在某个举行中紧跟在A后面的终结符a的集合,记为FOLLOW(A)
如果A是某个句型的最右符号,则将结束符“$”添加到FOLLOW(A)中。

例:文法:
S \rightarrow aBC
B \rightarrow bC
B \rightarrow dB
B \rightarrow ε
C \rightarrow c
C \rightarrow a
中,FOLLOW(B) = {a, c}

产生式的可选集(SELECT)

产生式A \rightarrow β的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT(A->β)
例如
SELECT(A -> aβ)={a}
SELECT(A -> aβ | bγ)={a, b}
SELECT(A -> ε)=FOLLOW(A)

q_文法

  • 每个产生式的右部或为ε,或以终结符开始;
  • 具有相同左部的产生式有不相交的可选集;
  • q_文法不含右部以非终结符打头的产生式。

串首终结符集(FIRST)

文法符号串α串首终结符的集合,记作FIRST(A)

  • 对于∀α∈(V_T∪V_N)^+,FIRST(α) = \{\ a\ |\ α \Rightarrow^*aβ,a∈V_T,β∈(V_T∪V_N)^*\}
  • 如果\alpha \Rightarrow^* ε,那么ε∈FIRST(\alpha)

LL(1)文法

LL(1)文法
LL1名称的含义

相关文章

网友评论

      本文标题:【编译原理】第四章:语法分析

      本文链接:https://www.haomeiwen.com/subject/pkyjaktx.html