将EBNF转换为BNF基础知识
问题描述:
我不太清楚如何回答我的计算机语言课程的问题。我给下面的语句转换从EBNF形式BNF形式:将EBNF转换为BNF基础知识
EBNF:expr --> [-] term {+ term}
据我了解,包括大括号中的表达式要重复零次或更多次,而这包括直角括号内的事情代表零个或一个选项。如果我的理解是正确的,这是否是一个正确的转换?
我BNF:
expr --> expr - term
| expr + term
| term
答
我不认为这是正确的。事实上,我不认为EBNF实际上是有效的EBNF。 How to convert BNF to EBNF这个问题的答案显示了EBNF是如何构建的,引用了ISO/IEC 14977:1996的Extended Backus-Naur Form标准。
我认为表达:
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。如果它只是一种随机BNF风格的语言,称为EBNF,我想这只是令人困惑的名字。私人方言只要定义好就可以,但方言不知道的人不可能知道正确答案是什么。