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

问题描述 投票:0回答:1

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

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

我不知道','来自哪里。

谢谢。

bison ebnf
1个回答
1
投票

VHDL描述非常清楚:您需要一个由垂直条分隔的choice列表。 EBNF可能令人困惑,因为垂直条可能被误解为EBNF运算符。但从描述中可以看出,它实际上是一种象征。

所以,在bison / yacc语法中:

choices: choice
       | choices '|' choice
© www.soinside.com 2019 - 2024. All rights reserved.