【问题标题】:How to convert this grammar to LL(1)?如何将此语法转换为 LL(1)?
【发布时间】:2015-04-01 20:08:42
【问题描述】:

S → Y | 1X

X → 1X | 0

Y → Y 0 | 1X1 | 2X2

当有多个相同符号时,我不明白如何进行因式分解或替换。谢谢你。

【问题讨论】:

    标签: parsing automata ll


    【解决方案1】:
    X → 1 X | 0
    

    指的是 0 个或多个 1 后跟 0,所以它相当于

    X → 1* 0
    

    同样的方法可以用来移除你的左递归。你可以重写

    S → Y | 1 X
    X → 1 X | 0
    Y → Y 0 | 1 X 1 | 2 X 2
    

    作为

    S → Y | 1 X
    X → 1* 0
    Y → ( 1 X 1 | 2 X 2 )* 0
    

    在 EBNF 中:

    S → Y | 1 X
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    

    在 BNF 中:

    S → Y | 1 X
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    
    1* → 1 1* | Ɛ
    A* → A A* | Ɛ
    

    如果您只想消除左递归,那么您就完成了。


    如果您还想消除常见前缀,您还没有完成,因为S 的两个子规则都可以以1 X 开头。要解决此问题,请内联并分发以获取以下内容:

    S → 0
      | 1 X 1 Y
      | 2 X 2 Y
      | 1 X
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    

    现在,我们终于可以分解常见的1 X了。

    S → 0
      | 1 X ( 1 Y )?
      | 2 X 2 Y
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    

    在 EBNF 中:

    S → 0 | 1 X B? | 2 X 2 Y
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    B → 1 Y
    

    在 BNF 中:

    S → 0 | 1 X B? | 2 X 2 Y
    X → 1* 0
    Y → A* 0
    A → 1 X 1 | 2 X 2
    B → 1 Y
    
    B? → B    | Ɛ
    1* → 1 1* | Ɛ
    A* → A A* | Ɛ
    

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多