2

我不太确定如何回答我的计算机语言课的问题。我要将以下语句从 EBNF 形式转换为 BNF 形式:

EBNF:expr --> [-] term {+ term}

我知道花括号中包含的表达式将重复零次或多次,而直角括号中包含的内容代表零个或一个选项。如果我的理解是正确的,这是否是正确的转换?

我的 BNF:

expr --> expr - term
       | expr + term
       | term

奖金阅读

4

1 回答 1

2

我不认为这是正确的。事实上,我不认为 EBNF 实际上是有效的 EBNF。如何将 BNF 转换为 EBNF问题的答案显示了有效的 EBNF 是如何构造的,引用自 ISO/IEC 14977:1996,扩展巴科斯-瑙尔形式标准。

我认为表达式:

expr --> [-] term {+ term}

应该写成:

expr = [ '-' ] term { '+', term };

这意味着一个表达式由一个可选的减号组成,后跟一个term,然后是一个零序列,多个加号和 a 出现term

下一个问题:您针对的是 BNF 的哪种方言?这里的事情变得棘手;有很多方言。但是,这是一种可能的翻译:

<expr> ::= [ MINUS ] <term> <opt_add_term_list>

<opt_add_term_list> ::= /* Nothing */
     | <opt_add_term_list> <opt_add_term>

<add_term> ::= PLUS term

其中 MINUS 和 PLUS 是终端(用于“-”和“+”)。这是一个非常严格但最小的 BNF。另一种可能的翻译是:

<expr> ::= [ MINUS ] <term> { PLUS <term> }*

其中{ ... }*部分表示零个或多个包含的模式...PLUS <term>在本例中如此)。或者您可以使用带引号的字符:

<expr> ::= [ '-' ] <term> { '+' <term> }*

因此,可能的替代方案清单还在继续。你必须查看你被赋予工作的 BNF 的定义,如果它是 ISO 标准 EBNF,你应该抱怨你得到的非常草率的 EBNF。如果它只是一些称为 EBNF 的随机 BNF 风格的语言,我想它只是令人困惑的名称。私人方言只要有定义就可以,但不熟悉方言的人不可能知道正确答案是什么。

于 2013-02-25T06:48:16.930 回答