我不太确定如何回答我的计算机语言课的问题。我要将以下语句从 EBNF 形式转换为 BNF 形式:
EBNF:expr --> [-] term {+ term}
我知道花括号中包含的表达式将重复零次或多次,而直角括号中包含的内容代表零个或一个选项。如果我的理解是正确的,这是否是正确的转换?
我的 BNF:
expr --> expr - term
| expr + term
| term
奖金阅读
- 将 EBNF 转换为 BNF (一般规则)
我不太确定如何回答我的计算机语言课的问题。我要将以下语句从 EBNF 形式转换为 BNF 形式:
EBNF:expr --> [-] term {+ term}
我知道花括号中包含的表达式将重复零次或多次,而直角括号中包含的内容代表零个或一个选项。如果我的理解是正确的,这是否是正确的转换?
我的 BNF:
expr --> expr - term
| expr + term
| term
我不认为这是正确的。事实上,我不认为 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 风格的语言,我想它只是令人困惑的名称。私人方言只要有定义就可以,但不熟悉方言的人不可能知道正确答案是什么。