Bison 将特定EBNF规则转换为BNF时出现问题

Bison 将特定EBNF规则转换为BNF时出现问题,bison,ebnf,Bison,Ebnf,我正在使用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 | choic

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

在第二种情况下,选项可以替换为选项列表, 由竖条隔开

我不知道这是从哪里来的


谢谢。

VHDL描述非常清楚:您需要一个由竖条分隔的选项列表。EBNF可能令人困惑,因为竖条可能被误解为EBNF运算符。但从描述来看,很明显,它实际上是一个标记

因此,在bison/yacc语法中:

choices: choice
       | choices '|' choice

逗号只是标点符号,写这句话的人认为标点符号必须放在引号内。你的语法缺少的是竖条分隔的部分。所以。。。你知道怎么解决这个错误吗?非常感谢!我的母语是西班牙语,让我感到困惑。现在它有了意义:-