【问题标题】:I'm struggling to the translation from EBNF to BNF我正在努力将 EBNF 翻译成 BNF
【发布时间】:2016-04-04 07:33:23
【问题描述】:

我正在学习编译器和编程语言的概念。 怎么翻译?

问题:

   <S> → (+ | -)[<C>]{<A>}

一开始我是这样翻译的:

<S> -> epsilon
     | +<S>
     | -<S>
     | <C><S>
     | <A><S>

但是,它有一个问题是它可以重现C!

【问题讨论】:

  • 您的问题不清楚。 什么可以(重新?)产生C,为什么那么糟糕?如果您展示了您产生答案的阶段以及每个步骤的理由,那将非常有帮助。

标签: compiler-construction programming-languages bnf ebnf


【解决方案1】:

你的 BNF 版本不仅可以生成多个&lt;C&gt;s,还可以生成多个+s 和-s(或零,这也与原始语法不同)。

要解决这些问题,您需要引入额外的非终端。具体来说,您可以有一个只匹配{&lt;A&gt;} 和一个匹配[&lt;C&gt;]。您对&lt;S&gt; 的定义可能是:

<S> -> + <OptionalC> <RepeatedA>
     | - <OptionalC> <RepeatedA>

【讨论】:

    【解决方案2】:

    您的 EBNF 原始文件在 &lt;S&gt; 中不是递归的,但您的试用版 BNF 是。如果您希望 BNF 生成相同的语言,您不应该这样做。此外,您的 EBNF 无法生成 epsilon,因此您也不应该将其添加到您的 &lt;S&gt;-production 中。

    正如另一个答案所说,您需要引入额外的非终端:

    <S> -> <plusminus> <optionalC> <repeatedA>
    <plusminus> -> + | -
    <optionalC> -> <C> | epsilon
    <repeatedA> -> <A> <repeatedA> | epsilon
    

    这是对原始语法中 EBNF 元素的直接翻译。即使您有额外的要求(例如 epsilon-elimination),您也应该从这种步骤开始。

    请注意,&lt;S&gt; 规则不是递归的。此外,虽然 epsilon 用于一些额外的非终结符,但它不是 &lt;S&gt;&lt;plusminus&gt; 规则的一部分,因此,与 EBNF 原版一样,&lt;S&gt; 无法生成它。

    【讨论】:

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