自上而下的语法分析

进行自上而下的语法分析,基于文法是LL(1)文法。分为递归下降的分析和预测分析。

提取左公因子

对产生式组
A → α ∣ α b 1 ∣ α b 2 ∣ … ∣ α b m ∣ γ 1 ∣ γ 2 ∣ … ∣ γ p A \rightarrow \alpha | \alpha b_1 | \alpha b_2 | \ldots | \alpha b_m | \gamma_1 | \gamma_2 | \ldots | \gamma_p Aααb1αb2αbmγ1γ2γp
用如下产生式组替换
A → α A ′ ∣ γ 1 ∣ γ 2 ∣ … ∣ γ p A \rightarrow \alpha A ^ { \prime } \left| \gamma _ { 1 } \right| \gamma _ { 2 } | \ldots | \gamma _ { p } AαAγ1γ2γp
A ′ → ε ∣ b 1 ∣ b 2 ∣ … ∣ b m A ^ { \prime } \rightarrow \varepsilon | b _ 1| b _ 2 | \dots | b _ { \mathrm { m } } Aεb1b2bm

消除左递归

对产生式组
A → A α 1 ∣ A α 2 ∣ ⋯ ∣ A α n ∣ β 1 ∣ β 2 ∣ … ∣ β m A \rightarrow A \alpha _ { 1 } | A \alpha _ { 2 } | \cdots | A \alpha _ { n } | \beta _ { 1 } | \beta _ { 2 } | \ldots | \beta _ { m } AAα1Aα2Aαnβ1β2βm
用如下产生式组替换
A → β 1 A ′ ∣ β 2 A ′ ∣ … ∣ β m A ′ A \rightarrow \beta _ { 1 } A ^ { \prime } | \beta _ { 2 } A ^ { \prime } | \ldots | \beta _ { m } A ^ { \prime } Aβ1Aβ2AβmA
A ′ → α 1 A ′ ∣ α 2 A ′ ∣ … ∣ α n A ′ ∣ ε A ^ { \prime } \rightarrow \alpha _ { 1 } \mathrm { A ^ { \prime } } | \alpha _ { 2 } \mathrm { A ^ { \prime } } |\ldots | \alpha _ { \mathrm { n } } \mathrm { A ^ { \prime } } | \varepsilon Aα1Aα2AαnAε
Tips: 消除左递归并非一定产生等价的LL(1)文法。
S → A a ∣ b , A → S B , B → a b S\rightarrow Aa \mid b, A\rightarrow SB, B\rightarrow ab SAab,ASB,Bab

  • 如果把A的产生式代入S的产生式得到等价文法是LL(1)的。
  • 如果把S的产生式代入A的产生式得到等价文法不是LL(1)的。

LL(1)文法

第一个L代表从左到右扫描输入串,第二个L代表最左推导,1表示分析的每一步只需向前查看一个符号。
LL(1)文法具有无二义性、无左公因子、无左递归的性质。对于文法的任何非终结符,使用它匹配输入串时,能够根据所面临的输入符号准确的选择产生式,如果该产生式匹配成功,那么这个匹配不是虚假匹配,如果该产生式匹配不成功,则用其他的产生式也一定不会匹配成功。

判断一个文法是否是LL(1)文法

对于文法中的任何两个产生式 A → α ∣ β A\rightarrow\alpha\mid\beta Aαβ,满足:

  • FISRT( α \alpha α) ⋂ \bigcap FISRT( β \beta β)= ∅ \varnothing
  • 如果 β ⇒ ∗ ε \beta\Rightarrow^*\varepsilon βε,那么 F I S R T ( α ) ⋂ F O L L O W ( β ) = ∅ FISRT(\alpha)\bigcap FOLLOW(\beta)=\varnothing FISRT(α)FOLLOW(β)=

非递归分析预测分析表的构建

  • 对文法的每个产生式 A → α A\rightarrow\alpha Aα,执行第二步和第三步。
  • 对FIRST( α \alpha α)的每个终结符a,把 A → α A\rightarrow\alpha Aα加入 M[A, a](即加入表中A行a列)。
  • 如果 ε \varepsilon ε在FIRST( α \alpha α)中,对FOLLOW(A)的每个终结符b(包括$), 把 A → α A\rightarrow\alpha Aα加入M[A, b]。
  • M的其它没有定义的条目都是error。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值