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

时间:2019-03-02 13:43:16

标签: bison ebnf

我正在使用Flex / Bison和VHDL93。以下规则存在问题:

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标准如下:

  

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

我不知道','的来源。

谢谢。

1 个答案:

答案 0 :(得分:1)

VHDL的描述非常清楚:您需要choice的列表,这些列表用竖线分隔。 EBNF可能会造成混淆,因为竖线可能会被误解为EBNF运算符。但是从描述中可以看出,它实际上是一个令牌。

因此,以bison / yacc语法:

choices: choice
       | choices '|' choice