编译原理_LL(1)

因为过去几节课比较摸鱼,到了这节已经有好多听不懂了。
所以试着学一下LL(k)
一路上遇到不少坑 记录一下
(突然学会了点 L A T E X L^AT_EX LATEX正好试试看)
R e f e r e n c e s : References: References
写得很好的博文
写得很好的博文
讲解很明确的pdf
wiki传送门

1. c o n t e x t − f r e e   g r a m m a r   上 下 文 无 关 文 法 1.context-free\ grammar \ 上下文无关文法 1.contextfree grammar 
引用知乎上的回答:
上下文无关文法就是说这个文法中所有的产生式左边只有一个非终结符
比如:
S → a S b S \rightarrow aSb SaSb
S → a b S \rightarrow ab Sab
这个文法有两个产生式,每个产生式左边只有一个非终结符S,这就是上下文无关文法,因为你只要找到符合产生式右边的串,就可以把它归约为对应的非终结符。
比如:
a S b → a a S b b aSb \rightarrow aaSbb aSbaaSbb
S → a b S \rightarrow ab Sab
这就是上下文相关文法,因为它的第一个产生式左边有不止一个符号,所以你在匹配这个产生式中的S的时候必需确保这个S有正确的“上下文”,也就是左边的a和右边的b,所以叫上下文相关文法。

作者:徐辰 链接:https://www.zhihu.com/question/21833944/answer/40689967

2. L e f t   d e r i v a t i o n 2.Left\ derivation 2.Left derivation 最左推导
每次对最左边非终结符进行替换 直到无法替换为止

3. F i r s t   s e t 3.First\ set 3.First set
求法:
如果 S → a S\rightarrow a Sa 若a是终止符 ,就直接把a放到 F i r s t ( S ) First(S) First(S)
如果 S → A S\rightarrow A SA 若A不是终止符,就把 F i r s t ( A ) First(A) First(A)的元素加入 F i r s t ( S ) First(S) First(S)
如果 S → A B C S\rightarrow ABC SABC 若ABC不是终止符:
若A不含 ϵ \epsilon ϵ F i r s t ( S ) = F i r s t ( A ) First(S)=First(A) First(S)=First(A),
否则 若B不含 ϵ \epsilon ϵ F i r s t ( S ) = ( F i r s t ( A ) − ϵ ) ∪ F i r s t ( B ) First(S)=(First(A)-\epsilon) \cup First(B) First(S)=(First(A)ϵ)First(B),
否则 F i r s t ( S ) = ( F i r s t ( A ) − ϵ ) ∪ ( F i r s t ( B ) − ϵ ) ∪ F i r s t ( C ) First(S)=(First(A)-\epsilon) \cup (First(B)-\epsilon) \cup First(C) First(S)=(First(A)ϵ)(First(B)ϵ)First(C)

4. F o l l o w   s e t 4.Follow\ set 4.Follow set
求法:
1.如果存在一个产生式 A → . . . U P A\rightarrow... UP A...UP,那么 F i r s t ( P ) First(P) First(P)中除了 ϵ \epsilon ϵ之外都应该放入 F o l l o w ( U ) Follow(U) Follow(U)
2.如果一个存在一个产生式 A → . . . U A\rightarrow...U A...U,或者存在产生式 A → . . . U P A\rightarrow... UP A...UP,且 F i r s t ( P ) First(P) First(P)中包含 ϵ \epsilon ϵ,则 F o l l o w ( A ) Follow(A) Follow(A)中的所有元素都在 F o l l o w ( U ) Follow(U) Follow(U)
3.若S是开始标记,$是结束标记,则在 F o l l o w ( S ) Follow(S) Follow(S)中加入$

可以做一个练习…
E → T E ′ E\rightarrow TE' ETE
E ′ → + T E ′ ∣ ϵ E'\rightarrow+TE'|\epsilon E+TEϵ
T → F T ′ T\rightarrow FT' TFT
T ′ → ∗ F T ′ ∣ ϵ T'\rightarrow *FT'|\epsilon TFTϵ
F → ( E ) ∣ i d F\rightarrow (E)|id F(E)id

根据上面的分类方法,我们可以得到:
F I R S T ( E ) = F I R S T ( T ) = F I R S T ( F ) = { ( , i d } FIRST(E) = FIRST(T) = FIRST(F) = \{( , id \} FIRST(E)=FIRST(T)=FIRST(F)={(,id}

F I R S T ( E ′ ) = F I R S T ( + ) ∪ F I R S T ( ε ) = { + , ϵ } FIRST(E') = FIRST(+) \cup FIRST(ε)= \{ + , \epsilon \} FIRST(E)=FIRST(+)FIRST(ε)={+,ϵ}

F I R S T ( E ′ ) = F I R S T ( ∗ ) ∪ F I R S T ( ε ) = { ∗ , ε } FIRST(E') = FIRST(*) \cup FIRST(ε)= \{ * , ε \} FIRST(E)=FIRST()FIRST(ε)={,ε}

F O L L O W ( E ) = F O L L O W ( E ′ ) = { ) , $ } FOLLOW(E) = FOLLOW(E') = \{) , \$\} FOLLOW(E)=FOLLOW(E)={),$}

F O L L O W ( T ) = F O L L O W ( T ′ ) = { + , ) , $ } FOLLOW(T) = FOLLOW(T') = \{+ , ) , \$\} FOLLOW(T)=FOLLOW(T)={+,),$}

F O L L O W ( F ) = { ∗ , + , ) , $ } FOLLOW(F) = \{* , + , ) , \$\} FOLLOW(F)={,+,),$}

你学会了吗?


5. L L ( 1 )   g r a m m a r 5.LL(1)\ grammar 5.LL(1) grammar
解释
LL(1) 中第一个“L”表示从左向右扫描输入,第二个“L”表示产生最左推导,而“1”表示在每一步中只需要向前看一个输入符号来决定语法分析动作。

定义
对于文法LL(1)文法G,当且仅当G的任意两个不同产生式 A → α ∣ β A \rightarrow \alpha | \beta Aαβ
(1)不存在终结符号a使得α和β都能推导出以a开头的串。
(2) α \alpha α β \beta β中最多只有一个可以推导出空串。
(3)如果 β → ϵ \beta\rightarrow \epsilon βϵ,那么α不能推导出任何以Follow(A)中某个终结符号开头的串。

构建预测分析表
方法:
对于文法G的每个产生式 A → α A\rightarrow α Aα ,进行如下处理
(1)对于FIRST(α)中每个终结符号a,将 A → α A\rightarrow α Aα 加入到 M[A,a] 中。
(2)如果 ε在FIRST(α)中,那么对于FOLLOW(A)中每个终结符号b,将 A → α A\rightarrow α Aα 加入到 M[A,b] 中。如果 ε在FIRST(α),且在FOLLOW(A)中,也将 A → α A\rightarrow α Aα 加入到M[A,]中。
以之前的练习为例:

E → T E ′ E\rightarrow TE' ETE
E ′ → + T E ′ ∣ ϵ E'\rightarrow+TE'|\epsilon E+TEϵ
T → F T ′ T\rightarrow FT' TFT
T ′ → ∗ F T ′ ∣ ϵ T'\rightarrow *FT'|\epsilon TFTϵ
F → ( E ) ∣ i d F\rightarrow (E)|id F(E)id

根据上面的分类方法,我们可以得到:
F I R S T ( E ) = F I R S T ( T ) = F I R S T ( F ) = { ( , i d } FIRST(E) = FIRST(T) = FIRST(F) = \{( , id \} FIRST(E)=FIRST(T)=FIRST(F)={(,id}
F I R S T ( E ′ ) = F I R S T ( + ) ∪ F I R S T ( ε ) = { + , ϵ } FIRST(E') = FIRST(+) \cup FIRST(ε)= \{ + , \epsilon \} FIRST(E)=FIRST(+)FIRST(ε)={+,ϵ}
F I R S T ( E ′ ) = F I R S T ( ∗ ) ∪ F I R S T ( ε ) = { ∗ , ε } FIRST(E') = FIRST(*) \cup FIRST(ε)= \{ * , ε \} FIRST(E)=FIRST()FIRST(ε)={,ε}
F O L L O W ( E ) = F O L L O W ( E ′ ) = { ) , $ } FOLLOW(E) = FOLLOW(E') = \{) , \$\} FOLLOW(E)=FOLLOW(E)={),$}
F O L L O W ( T ) = F O L L O W ( T ′ ) = { + , ) , $ } FOLLOW(T) = FOLLOW(T') = \{+ , ) , \$\} FOLLOW(T)=FOLLOW(T)={+,),$}
F O L L O W ( F ) = { ∗ , + , ) , $ } FOLLOW(F) = \{* , + , ) , \$\} FOLLOW(F)={,+,),$}

构建表
在这里插入图片描述
按照规则1
在这里插入图片描述
按照规则2
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值