将特定 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
我正在使用 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