【问题标题】:Assistance swapping a grammar to LL(1)协助将语法转换为 LL(1)
【发布时间】:2015-05-08 08:22:13
【问题描述】:

我有以下语法

S -> E | S A | A
E -> if (C) {S} | if (C) {S} else {S}
A -> V := T;
T -> a | b
V -> x | y
C -> V O T | T O V | V O V | T O T
O -> < | >

据此,我说这个语法不是 LL(1) 是否正确,因为对于规则 E,“如果 (C) {S}”可以被左分解并且规则 S 具有左递归?

解决此问题的正确方法是什么? 我在想这样的事情:

S -> P
P -> ER | AR
R -> AR | ε
E -> if (C) {S} B
B -> else {S}
A -> V := T;
T -> a | b
V -> x | y
C -> V O T | T O V | V O V | T O T
O -> < | >

【问题讨论】:

标签: parsing grammar ll


【解决方案1】:

左分解E

你建议考虑

E -> if (C) {S} | if (C) {S} else {S}

进入

E -> if (C) {S} B
B -> else {S}

现在,不再可能解析 if (C) {S} 表单,因为 B 不能为空。所以,这种转换是不正确的

相反,考虑一下:

B -> else {S} | ε

删除S 中的直接左递归

你建议更换

S -> E | S A | A

通过

S -> P
P -> ER | AR
R -> AR | ε

虽然这是一个正确转换,但以下也足够了:

S -> ER | AR
R -> AR | ε

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多