我正在使用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标准如下:
在第二种情况下,“选择”可以替换为“选择”列表 用竖线分隔。
我不知道','的来源。
谢谢。
答案 0 :(得分:1)
VHDL的描述非常清楚:您需要choice
的列表,这些列表用竖线分隔。 EBNF可能会造成混淆,因为竖线可能会被误解为EBNF运算符。但是从描述中可以看出,它实际上是一个令牌。
因此,以bison / yacc语法:
choices: choice
| choices '|' choice