【发布时间】:2012-02-12 00:07:34
【问题描述】:
我最近在想下面的BNF
A -> x | yA | yAzA
where x,y,z are terminals.
我很确定这个语法是模棱两可的,但是如何使它明确呢?
【问题讨论】:
我最近在想下面的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。我建议您查看该页面,了解如何解决此问题。
【讨论】: