【问题标题】:Converting EBNF to BNF basics将 EBNF 转换为 BNF 基础知识
【发布时间】:2013-02-25 03:50:51
【问题描述】:

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

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

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

我的 BNF:

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

阅读奖励

【问题讨论】:

  • 这个问题不是重复的。链接的问题要求提供一般规则列表。这个问题是关于一个特定的表达。虽然规则可能在回答这个问题时很有用:链接的答案不回答 this 问题。
  • @IanBoyd 不过,一般规则更好,因为问题的答案应该对不止一个人有用。而且,其他问题中的规则足以解决这个问题。
  • @Brilliand 我不同意。我尝试将规则应用于这个实际示例。规则以抽象的第三种表示法编写,不是 BNF 或 EBNF (例如,ε 是什么?. 是什么?)。它似乎有隐含的步骤(即我认为规则试图表明你必须引入中间定义)。所以,如果是我,我会问这个问题。也许引用的规则需要使用某种形式的巴库斯-瑙尔语法进行编辑。

标签: bnf ebnf


【解决方案1】:

我不认为这是正确的。事实上,我不认为 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 &lt;term&gt;)。或者你可以使用带引号的字符:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2021-11-29
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多