编译原理:LL(1)文法 发布时间:2025-03-26 16:19:06 更新时间:2025-07-04 18:44:32
🕒 阅读时间:2 分钟 📝 字数:406 👀 阅读量:Loading...
S_文法
:::tip
S_文法(简单的确定性文法)
每个产生式的右部都以终结符开始
同一非终结符的各个候选式的首终结符都不同
S_文法不含ε \varepsilon ε 产生式
:::
非终结符的后继符号集
可能在某个句型中,紧跟在A后边的终结符a的集合,记为FOLLOW(A)
F O L L O W ( A ) = { a ∣ S ⇒ ∗ α A a β . a ∈ V T , α , β ∈ ( V T ∪ V N ) ∗ } \\FOLLOW(A) = \{a| S \Rightarrow {}^*\alpha Aa \beta.a \in V_T,\alpha , \beta \in (V_T \cup V_N )^* \} F O LL O W ( A ) = { a ∣ S ⇒ ∗ α A a β . a ∈ V T , α , β ∈ ( V T ∪ V N ) ∗ }
:::info
如果A是某个句型的最右符号,则将结束符"$"添加到FOLLOW(A)中
:::
产生式的可选集
产生式A → β A \rarr \beta A → β 的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为S E L E C T ( A → β ) SELECT(A \rarr \beta) S E L E C T ( A → β )
S E L E C T ( A → a β ) = { a } SELECT(A \rarr a\beta ) = \{ a \} S E L E C T ( A → a β ) = { a }
S E L E C T ( A → ε ) = F O L L O W ( A ) SELECT(A \rarr \varepsilon ) = FOLLOW(A) S E L E C T ( A → ε ) = F O LL O W ( A )
q_文法
每个产生式的右部或为 ε \varepsilon ε ,或以终结符开始
具有相同左部的产生式有不相交的可选集
串首终结符
串首第一个符号,并且是终结符,简称首终结符
给定一个文法符号 α \alpha α ,α \alpha α 的串首终结符集F I R S T ( α ) FIRST(\alpha) F I R S T ( α )
被定义为可以从α \alpha α 推导出的所有串首终结符构成的集合.如果α ⇒ \* ε \alpha \Rightarrow {}^\* \varepsilon α ⇒ \* ε
那么v a r e p s i l o n varepsilon v a r e p s i l o n 也在F I R S T ( α ) FIRST(\alpha) F I R S T ( α ) 中
对于 ∀ α ∈ ( V T ∪ V N ) + , F I R S T ( α ) = a ∣ α ⇒ ∗ a β , a ∈ V T , β ∈ ( V T ∪ V N ) ∗ ∀α∈(V_T∪V_N)^+,FIRST(α)= {a | α ⇒* aβ,a ∈ V_T,β∈(V_T∪V_N)^*} ∀ α ∈ ( V T ∪ V N ) + , F I R S T ( α ) = a ∣ α ⇒ ∗ a β , a ∈ V T , β ∈ ( V T ∪ V N ) ∗ ;
如果 α ⇒ ∗ ε ,那么 ε ∈ F I R S T ( α ) α ⇒* ε,那么 ε∈FIRST(α) α ⇒ ∗ ε ,那么 ε ∈ F I R S T ( α )
产生式 A→α 的可选集 SELECT
如果 ε ∉ F I R S T ( α ) ,那么 S E L E C T ( A → α ) = F I R S T ( α ) ε∉FIRST(α),那么 SELECT(A→α)= FIRST(α) ε ∈ / F I R S T ( α ) ,那么 S E L E C T ( A → α ) = F I R S T ( α )
如果 ε ∈ F I R S T ( α ) ,那么 S E L E C T ( A → α ) = ( F I R S T ( α ) − ε ) ∪ F O L L O W ( A ) ε∈FIRST(α),那么 SELECT(A→α)= (FIRST(α)-{ε})∪FOLLOW(A) ε ∈ F I R S T ( α ) ,那么 S E L E C T ( A → α ) = ( F I R S T ( α ) − ε ) ∪ F O LL O W ( A )
LL(1)文法
文法G是LL(1)的,当且仅当G的任意两个具有相同左部的产生式A → α ∣ β A \rarr \alpha|\beta A → α ∣ β 满足下面的条件
如果α 和 β 均不能推导出 ε \alpha 和 \beta 均不能推导出 \varepsilon α 和 β 均不能推导出 ε ,则 F I R S T ( α ) ∩ F I R S T ( β ) = ∅ FIRST(\alpha) \cap FIRST(\beta) = \emptyset F I R S T ( α ) ∩ F I R S T ( β ) = ∅
α 和 β \alpha 和 \beta α 和 β 至多有一个能推导出 ε \varepsilon ε
如果 β ⇒ ∗ ε \beta \Rightarrow {}^* \varepsilon β ⇒ ∗ ε .则F I R S T ( α ) ∪ F O L L O W ( A ) = ∅ FIRST(\alpha)\cup FOLLOW(A) = \emptyset F I R S T ( α ) ∪ F O LL O W ( A ) = ∅
如果 α ⇒ ∗ ε \alpha \Rightarrow {}^* \varepsilon α ⇒ ∗ ε .则F I R S T ( β ) ∪ F O L L O W ( A ) = ∅ FIRST(\beta)\cup FOLLOW(A) = \emptyset F I R S T ( β ) ∪ F O LL O W ( A ) = ∅
:::tip
同一非终结符的各个产生式的可选集互不相交
:::
第一个L表示从左向右扫描输入
第二个L表示产生最左推导
1表示在每一步中只需要向前看一个输入符号来决定语法分析动作
留言评论