2013-02-25 72 views
1

我不太清楚如何回答我的计算机语言课程的问题。我给下面的语句转换从EBNF形式BNF形式:将EBNF转换为BNF基础知识

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

据我了解,包括大括号中的表达式要重复零次或更多次,而这包括直角括号内的事情代表零个或一个选项。如果我的理解是正确的,这是否是一个正确的转换?

我BNF:

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

回答

2

我不认为这是正确的。事实上,我不认为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,我想这只是令人困惑的名字。私人方言只要定义好就可以,但方言不知道的人不可能知道正确答案是什么。