IT干货网

grammar之BNF 语法歧义

cmt 2024年11月01日 编程设计 16 0

最近在想下面的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 .我建议查看该页面以获取有关如何解决此问题的想法。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!