我的计算机语言课已经有几年了,所以我已经忘记了 BNF 和 EBNF 的优点,而且我身边没有教科书。具体来说,我忘记了如何将 EBNF 转换为 BNF。
根据我的记忆,我知道其中一个要点是转换
{ term }
进入
<term> | <many-terms>
但我不记得其他规则。我试图在网上查找这个,但我只能找到指向作业问题的链接,或者关于用花括号转换术语的小评论。我找不到定义翻译的详尽规则列表。
我的计算机语言课已经有几年了,所以我已经忘记了 BNF 和 EBNF 的优点,而且我身边没有教科书。具体来说,我忘记了如何将 EBNF 转换为 BNF。
根据我的记忆,我知道其中一个要点是转换
{ term }
进入
<term> | <many-terms>
但我不记得其他规则。我试图在网上查找这个,但我只能找到指向作业问题的链接,或者关于用花括号转换术语的小评论。我找不到定义翻译的详尽规则列表。
请参阅此页面。它包含需要转换的每个产品的说明:
从 EBNF 到 BNF
对于构建解析器(尤其是自下而上),BNF 语法通常比 EBNF 更好。但是将 EBNF 语法转换为 BNF 很容易:
将每个重复转换
{ E }
为新的非终结符X
并添加X = ε | X E.
将每个选项转换
[ E ]
为新的非终端X
并添加X = ε | E.
(我们可以转换
X = A [ E ] B.
为X = A E B | A B.
)将每个组转换
( E )
为新的非终端X
并添加X = E.
我们甚至可以通过使用相同的非终端的多个产品来取消替代方案。
X = E | E'.
变成X = E. X = E'.
请注意:在 ISO 标准中列出的 EBNF 还包括句法规则的例外情况,这些例外情况没有 BNF 等效项。500 - Internal Server Error 给出的转换仅适用于与 RBNF/ABNF 重叠的部分 EBNF。