将 BNF 转换为 EBNF - 没有递归的括号?

发布于 2024-12-04 09:10:06 字数 564 浏览 0 评论 0原文

我需要将以下语法转换为EBNF:

<assign> -> <id> = <expr>
<id> -> A|B|C
<expr> -> <expr> + <expr>
    |<expr> * <expr>
    |<expr> * <expr>
    |( <expr> )
    |<id>

我目前取得的进展如下:

<assign> -> <id> = <expr>
<id> = (A | B | C)
<expr> -> <id> {(+ | * ) <expr>} | ‘(‘ <expr> ‘)’

如果使用EBNF,最好消除所有递归吗?有没有一种方法可以仅使用 中的 来完成它?

I need to convert the following grammar to EBNF:

<assign> -> <id> = <expr>
<id> -> A|B|C
<expr> -> <expr> + <expr>
    |<expr> * <expr>
    |<expr> * <expr>
    |( <expr> )
    |<id>

The progress I've currently made is below:

<assign> -> <id> = <expr>
<id> = (A | B | C)
<expr> -> <id> {(+ | * ) <expr>} | ‘(‘ <expr> ‘)’

Is it best to eliminate all recursion if using EBNF? Is there even a way to accomplish it using only <id> in <expr>?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

银河中√捞星星 2024-12-11 09:10:07

怎么样:

<assign> -> <id> = <expr>
<expr>   -> <mul>  {+ <mul>}
<mul>    -> <term> {* <term>}
<term>   -> ( <expr> ) | <id>
<id>     -> A | B | C

没有左递归,并且 * 优先于 +,但不优先于 ( ... )

How about this:

<assign> -> <id> = <expr>
<expr>   -> <mul>  {+ <mul>}
<mul>    -> <term> {* <term>}
<term>   -> ( <expr> ) | <id>
<id>     -> A | B | C

No left recursion, and * takes precedence over +, but not over ( ... ).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文