我不太确定如何回答我的计算机语言课程的问题。我将以下语句从EBNF表单转换为BNF表单:
EBNF:expr --> [-] term {+ term}
我理解花括号中包含的表达式要重复零次或多次,直角括号中包含的内容表示零或一个选项。如果我的理解是正确的,这是否是正确的转换?
我的BNF:
expr --> expr - term
| expr + term
| term
答案 0 :(得分:2)
我不认为这是对的。事实上,我认为EBNF实际上并不是有效的EBNF。问题How to convert BNF to EBNF的答案显示了如何构建有效的EBNF,引用ISO / IEC 14977:1996,扩展巴克斯 - 诺尔表格标准。
我认为表达式:
expr --> [-] term {+ term}
应写成:
expr = [ '-' ] term { '+', term };
这意味着表达式包含一个可选的减号,后跟一个term
,后跟一个零序列,其中出现一个加号和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的定义,你应该抱怨你给出的非常草率的EBNF,如果它是ISO标准的EBNF。如果它只是一些名为EBNF的随机BNF风格的语言,我想这只是令人困惑的名字。只要定义了私人方言就可以了,但对于那些不懂方言的人来说,知道正确的答案是不可能的。