入門
解析の主なタスク:与えられた文法によれば、各コンポーネント識別入力文、構文解析ツリー文構築する
構文構造は、ほとんどのプログラミング言語にCFGトークンターミネーターとして、CFGによって記述することができる
最も解析それ以外の場合は、それが唯一のfor文の構文解析ツリーを構築することができない、文法があいまいで期待しています
解析の種類
トップダウン分析:底(リーフノード)に構文解析ツリーを構成トップ(ルート)からツリーの分析; W開始シンボル列Sに由来する文法
分析ボトムアップ:底(リーフノード)から解析木にトップパースツリーに構成(ルート);文字列にSが約ある文法の開始記号正規化wは
特定のクラスの別の方法を処理する最も効率的なトップダウンおよびボトムアップアプローチインテリジェントテキストを、これらのサブクラスのいくつか、特にLLとLR文法、作図線の代わりに、プログラミングの構文を記述するための最も表現十分
4.1トップダウン分析
1.概要
中wは単語列の文法Sの開始記号由来とみなすことができる
導出の各ステップ、我々は二つの選択肢を実行する必要があります。これは現在の文非終端記号を置き換え、と候補非終端記号式を交換します
図2に示すように、右端の導出と右端の導出
(1)最も左側
左端の導出において、それは常に置換左端の非終端記号のそれぞれの文のために選択され
= S> *場合LM α、最も左の文章文法と呼ばれます。
(2)右端導出
右端導出で常に置換右端の非終端記号のそれぞれの文のために選択された
左端の法令制定法はノルム、および右端の導出になるので、ボトムアップ分析で、常に、最も左側の法令の実施形態それに応じて正規の派生と呼ばれます
一意の(3)の左端導出と右端の導出
3、トップダウン構文
(1)トップダウン分析は、文法的な方法最左導出を用いて行きました
それぞれの文は常に一番左の非終端が置き換え選択
式の候補の左端の非終端記号を選択し、入力ストリームに従ってターミネータで
(2)のトップダウン解析の一般的な形
递归下降分析
由一组过程组成,每个过程对应一个非终结符
从文法开始符号S对应的过程开始,其中递归调用文法中其它非终结符对应的过程。如果S对应的过程体恰好扫描了整个输入串,则完成语法分析
(3)自顶向下分析过程中的问题
问题1:同一个非终结符的多个候选式存在共同前缀,将导致回溯现象
问题2:左递归文法会使递归下降分析器陷入无限循环
4、消除左递归
(1)消除直接左递归
一般形式
(2)消除间接左递归
(3)消除左递归算法
5、提取左公因子
6、预测分析
预测分析是递归下降分析技术的一个特例,通过在输入中向前看固定个数(通常是一个)符号来选择正确的A-产生式,可以以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也称为LL(k)文法类
预测分析不需要回溯,是一种确定的自顶向下分析方法
4.2 预测分析法
1、LL(1)文法
预测分析法的工作过程:从文法开始符号触发,在每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a,选择正确的A-产生式。为保证分析的确定性,选出的候选式必须是唯一的。
S_文法(简单的确定性文法,Korenjak & Hopcroft , 1966)
- 每个产生式的右部都以终结符开始
- 同一非终结符的各个候选式的首终结符都不同
- S_文法不含ε产生式
例:
是么时候会用ε产生式
如果当前某非终结符A与当前输入符a不匹配时,则存在A→ε,可以通过检查a是否可以出现A的后面,来决定是否使用产生式A→ε(若文法中无A→ε,则应报错)
非终结符的后继符号集
可能在某个句型中紧跟在A后边的终结符a的集合,记为FOLLOW(A)
FOLLOW(A)={a| S =>* αAaβ, a∈VT,α,β∈(VT∪VN) }
如果A是某个句型的最右符号,则将结束符“$”添加到FOLLOW(A)*中
产生式的可选集
产生式A→β的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT( A→β )
SELECT( A→aβ ) = { a }
SELECT( A→ε )=FOLLOW( A )
q_文法
- 每个产生式的右部或为ε,或以汇终结符开始
- 具有相同左部的产生式有不相交的可选集
- q_文法不含右部以非终结符打头的产生式
串首终结符集
串首的第一个符号,并且是终结符。简称串首终结符
给定一个文法符号串α,α的串首终结符*FIRST(α)*被定义为可以从α推导出的所有串首终结符构成的集合。如果α=>*ε,那么ε也在FIRST(α)中
计算文法符号X的FIRST(X)
算法
不断应用下列规则,直到没有新的终结符或ε可以被加入到任何FIRST集合中为止
- 如果X是一个终结符,那么FIRST(X) = {X}
- 如果X是一个非终结符,且X→Y1…Yk ∈ P(k>=1),那么如果对于某个i,a在FIRST (Yi ) 中且ε 在所有的 FIRST(Y1) , … , FIRST(Yi-1)中(即Y1…Yi-1=>* ε ),就把a加入 到FIRST( X )中。如果对于所有的 j = 1,2, . . . , k,ε在 FIRST(Yj)中,那么将ε加入到FIRST( X )
- 如果X→ε∈P,那么将ε加入到FIRST( X )中
计算串X1X2 …Xn的FIRST 集合
- 向FIRST(X1X2…Xn)加入FIRST(X1)中所有的非ε符号
- 如果ε在FIRST(X1)中,再加入FIRST(X2)中的所有非ε符号;如果ε在FIRST(X1)和FIRST(X2)中,再加入FIRST(X3)中的所有非ε符号,以此类推
- 最后,如果对所有的i,ε都在FIRST(Xi)中,那么将ε加入到FIRST(X1X2…Xn) 中
产生式A→α的可选集
产生式A→α的可选集SELECT
- 如果 ε∉FIRST(α), 那么SELECT(A→α)= FIRST(α)
- 如果 ε∈FIRST(α), 那么SELECT(A→α)=( FIRST(α)-{ε} )∪FOLLOW(A)
LL(1)文法
文法G是LL(1)的,当且仅当G的任意两个具有相同左部的产生式A → α | β 满足下面的条件:
- 不存在终结符a使得α和β都能够推导出以a开头的串
- α和β至多有一个能推导出ε
- 如果β=>ε,则FIRST (α)∩FOLLOW(A) =Φ;如果 α=> ε,则FIRST (β)∩FOLLOW(A) =Φ;
同一个非终结符的各个产生式的可选集互不相交
可以为LL(1)文法构造预测分析器
第一个“L”表示从左向右扫描输入
第二个“L”表示产生最左推导
“1”表示在每一步中只需要向前看一个输入符号来决定语法分析动作
计算非终结符A的FOLLOW(A)
算法
不断应用下列规则,直到没有新的终结符可以被加 入到任何FOLLOW集合中为止
- 将 是输入右端的结束标记
- 如果存在一个产生式A→αBβ,那么FIRST ( β )中除ε 之外的所有符号都在FOLLOW( B )中
- 如果存在一个产生式A→αB,或存在产生式A→αBβ且FIRST ( β ) 包含ε,那么 FOLLOW( A )中的所有符号都在FOLLOW( B )
例:表达式文法各产生式的SELECT集
LL(1)文法的分析方法
- 递归的预测分析法
- 非递归的预测分析法