BNF 语法歧义

发布于 2025-01-04 12:30:47 字数 129 浏览 1 评论 0原文

我最近在想下面的 BNF,

A -> x | yA | yAzA

where x,y,z are terminals.

我很确定这个语法是有歧义的,但是如何使它明确呢?

I was recently thinking of the following BNF

A -> x | yA | yAzA

where x,y,z are terminals.

I'm pretty sure this grammar is ambiguous, but how would one make it unambiguous?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魄砕の薆 2025-01-11 12:30:47

如果特定字符串可以有多个解析树,则语法是不明确的。在您的语言中,字符串 yyxzx 可以具有这两个解析树中的任何一个:

    A                  A
   / \                /|\`\
  y   A              y A z A
     /|\`\            / \   \
    y A z A          y   A   x
      |   |              |
      x   x              x

因此语法是不明确的。

这实际上相当于类 C 语言中臭名昭著的“if/then/else”歧义,其中 y=ifz=elsex=声明http://en.wikipedia.org/wiki/Dangling_else。我建议您查看该页面以获取有关如何解决此问题的想法。

A grammar is ambiguous if a particular string can have more than one parse tree. In your language the string yyxzx can have either of these two parse trees:

    A                  A
   / \                /|\`\
  y   A              y A z A
     /|\`\            / \   \
    y A z A          y   A   x
      |   |              |
      x   x              x

Therefore the grammar is ambiguous.

This actually is equivalent to the notorious "if/then/else" ambiguity in C-like languages, where y=if, z=else, and x=statement. http://en.wikipedia.org/wiki/Dangling_else. I would recommend checking out that page for ideas on how to get around this problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文