【问题标题】:Removing Left Recursion Algorithm by Hand手动去除左递归算法
【发布时间】:2013-11-01 03:03:53
【问题描述】:

我不确定如何完成这个语法的左递归删除算法。

S ::= a B | B S b | S a | S B A | b
B ::= S b A | B B | A S B | a
D ::= b a | S b
A ::= b S A | b | a b

这是我的工作。

using the order S, B, D, A.

S ::= a B M | B S b M | b M
M ::= a M | B A M | ε

B ::= a B M b A | B S b M b A | b M b A | B B | A S B | a

B ::= a B M b A N | b M b A N | A S B b A N | a N
N ::= S b M N | B N | ε

我应该如何从这里进步?

【问题讨论】:

    标签: compiler-construction grammar


    【解决方案1】:

    来自Dragon Book

    给定以下规则:

    A → Aα1 | ... | Aαm | β1 | ... | βn
    

    其中 βi 是非左递归的右侧,写成:

    A → β1 A' | ... | βn A'
    A' → α1 A' | ... | αm A' | ε
    

    要删除所有左递归,请使用此算法,为每个非终结符分配一个数字,A1...An,并且:

    for(int i = 1; i <= n; i++)
        for(int j = 1; j < i; j++)
            foreach(Ai → Ajα && Aj → β1 | ... | βn)
                replace with Ai → β1α |... | βnα
       remove left recursion from Ai
    

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2011-02-08
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多