问题描述
作为上下文,我的教科书对 EBNF 使用这种风格:
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 的名称更改为
总而言之,恐怕我不得不说,我认为您无权获得该解决方案的功劳。
注意事项
- 如果您真的提出了这个解释,那么您的教授可能有理由建议将专业转为法律。