【问题标题】:Problems to convert a particular EBNF rule to BNF将特定 EBNF 规则转换为 BNF 的问题
【发布时间】:2019-03-02 13:43:15
【问题描述】:

我正在使用 Flex/Bison 和 VHDL 93。我对以下规则有疑问:

choices ::= choice { | choice }

如果我将其转换为 BNF:

N1 ::= %empty | choice
N2 ::= %empty | N2 N1
choices ::= choice N2
choices ::= choice | choice N2 N1
choices ::= choice | choices N1
choices ::= choice | choices | choices choice

但是选择:选择是无用的,所以最后

choices ::= choice | choices choice

那么,问题出在哪里?好吧,想象一下要转换的规则是:

choices ::= choice { choice }

我应用规则转换为 BNF:

N1 ::= choice
N2 ::= %empty | N2 N1
choices ::= choice N2
choices ::= choice | choice N2 N1
choices ::= choice | choices N1
choices ::= choice | choices choice

这和之前的结果是一样的!!!发生了什么?哪里有问题?一年多前我遇到了这条规则的问题,我在这个项目中再次工作,我的选择问题仍然存在:P

VHDL 93 标准关于选择的内容如下:

在第二种情况下,“choices”可以替换为“choice”列表 用竖线分隔。

我不知道“,”是从哪里来的。

谢谢。

【问题讨论】:

  • 逗号就是标点符号,写这句话的人认为标点符号必须放在引号内。您的语法缺少的是“由竖线分隔”部分。
  • 那么...关于如何解决这个错误的任何想法?

标签: bison ebnf


【解决方案1】:

VHDL 描述非常清楚:您需要一个choice 列表,由竖线 分隔。 EBNF 可能令人困惑,因为竖线可能会被误解为 EBNF 运算符。但从描述中可以看出,它其实是一个token。

所以,在 bison/yacc 语法中:

choices: choice
       | choices '|' choice

【讨论】:

  • 非常感谢!我的母语是西班牙语,让我很困惑。现在有道理了:-)
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2021-11-29
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多