Compiler construction 如何将歧义语法转换为无歧义语法
我有一个语法我认为是模棱两可的。我不知道如何消除歧义并将其转换为明确的语法Compiler construction 如何将歧义语法转换为无歧义语法,compiler-construction,ambiguous-grammar,Compiler Construction,Ambiguous Grammar,我有一个语法我认为是模棱两可的。我不知道如何消除歧义并将其转换为明确的语法 expr ::= num | lvalue | incrop expr | expr incrop | expr binop expr | (expr) lvalue ::= $expr incrop ::= ++ | -- binop ::= + | - | num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 这就是我想到的: expr ::= nu
expr ::= num | lvalue | incrop expr | expr incrop | expr binop expr | (expr)
lvalue ::= $expr
incrop ::= ++ | --
binop ::= + | - |
num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
这就是我想到的:
expr ::= num expr' | lvalue expr'| incrop expr expr' | (expr) expr'
expr' ::= incrop expr' | binop expr expr' | empty
lvalue ::= $expr
incrop ::= ++ | --
binop ::= + | - |
num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
它是正确的吗?我认为,正如我写的那样,语法只能由一个无限序列的成对加号或减号来满足,因为
S
的第一个标记必须是++
或--
,后面必须跟一个S
(依次是++
或--
,后跟S
,无限大)@supercat它不是整个语法。这是使它模棱两可的部分。这部分本身并不使它模棱两可,因为S
没有有限的扩展,因此唯一相关的扩展是AS
。使它模棱两可的必要性取决于使它模棱两可的其他存在。@supercat我刚刚修改了语法。这是实际的语法请看一看,它试图解释如何编写一个没有这些歧义的语法。我认为在编写时,语法只能由一个无限序列的成对加号或减号来满足,因为S
的第一个标记必须是++
或--
,后面必须跟一个S
(这反过来又是++
或--
,后面跟着一个S
,无限大)@supercat它不是整个语法。这是使它模棱两可的部分。这部分本身并不使它模棱两可,因为S
没有有限的扩展,因此唯一相关的扩展是AS
。使它模棱两可的必要性取决于使它模棱两可的其他存在。@supercat我刚刚修改了语法。这是实际的语法请看一下,它试图解释如何编写一个没有这些歧义的语法。