最近在想下面的BNF
A -> x | yA | yAzA
where x,y,z are terminals.
我很确定这个语法是模棱两可的,但是如何使它不含糊呢?
请您参考如下方法:
如果一个特定的字符串可以有多个解析树,则语法是不明确的。在您的语言中,字符串 yyxzx
可以有这两个解析树之一:
A A
/ \ /|\`\
y A y A z A
/|\`\ / \ \
y A z A y A x
| | |
x x x
因此语法是有歧义的。
这实际上相当于类 C 语言中臭名昭著的“if/then/else”歧义,其中
y=if
,
z=else
, 和
x=statement
.
http://en.wikipedia.org/wiki/Dangling_else .我建议查看该页面以获取有关如何解决此问题的想法。