将特定 EBNF 规则转换为 BNF 的问题

Problems to convert a particular EBNF rule to BNF

我正在使用 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 标准关于选择的内容:

In the second case, "choices" can be replaced by a list of "choice," separated by vertical bars.

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

谢谢。

VHDL 描述非常清楚:您需要一个由 竖线 分隔的 choice 列表。 EBNF 可能会造成混淆,因为竖线可能会被误解为 EBNF 运算符。但从描述上看,这其实是一个token

因此,在 bison/yacc 语法中:

choices: choice
       | choices '|' choice