这种从 BNF 到 EBNF 的转换是否正确? 注意事项

问题描述

作为上下文,我的教科书对 EBNF 使用这种风格:

Text

Sebesta,Robert W. 编程语言概念第 11 版,Pearson,2016 年,150。

问题: 将以下具有三个 RHS 的 BNF 规则转换为具有单个 RHS 的 EBNF 规则。

注意:转换为 EBNF 应删除所有显式递归并生成单个 RHS EBNF 规则。

A ⟶ B + A | B – A |乙

我的解决方案:

A ⟶ B [ (+ | –) A ]

我的教授告诉我:

"首先,你应该使用{}而不是[], 其次,根据 BNF 规则, 是 B."(他指的是上面发布的样式指南)

他说得对吗?我是这么认为的,但已经阅读了其他 EBNF 样式,并想知道我是否有权获得信用。

解决方法

您被明确要求删除显式递归,而您提出的解决方案并未这样做; A 仍然根据自身定义。因此,与命名问题无关,您未能完成所要求的转换,并且您的教授正确地为您评分。所提出的问题的正确解决方案,忽略非终结符的名称,是 A ⟶ B { (+ | –) B },使用无限重复 ({…}) 而不是可选性 ([ ……])。使用此解决方案,A 生成式的右侧仅引用 B,因此没有递归(至少在此特定生成式中)。

现在,对于命名:显然,您教科书的 EBNF 风格是在非终结符名称周围使用尖括号。这是一种常见的风格,许多人会说它比使用对人类读者毫无意义的单个大写字母更具可读性。现在,我想您的教授认为您应该将 B 的名称更改为 ,因为这是非终端代表的“教科书”名称加法运算符的操作数。您被要求转换的原始 BNF 确实显示了两个加法运算符。然而,它使它们右结合,这绝对是非标准的。因此,您可能能够构建一个论点,即没有理由假设这些运算符是可加的,并且它们的操作数应称为“术语”[注 1]。但即使在此基础上,您也应该使用一些小写字母并用尖括号括起来的名称。对我来说,这与第一个问题相比微不足道,但您的教授可能有自己的标准。

总而言之,恐怕我不得不说,我认为您无权获得该解决方案的功劳。


注意事项

  1. 如果您真的提出了这个解释,那么您的教授可能有理由建议将专业转为法律。