关于BNF的问题

发布于 2024-10-15 21:36:57 字数 645 浏览 3 评论 0原文

我用 BNF 写了这个语法。如何将其转换为 + 优先于 * 并强制 + 为右关联?

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

这是我的解决方案:

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

如何检查给定语法的正确性?有什么想法吗?
谢谢,

I have this grammar written in BNF. How do I convert it to give + precedence over * and force + to be right associative?

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

This is my solution:

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

How could I check the correctness of a given grammar? Any idea?
Thanks,

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

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

发布评论

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

评论(1

清晰传感 2024-10-22 21:36:57

看起来很奇怪,你想要恢复乘法相对于加法的优先级,但无论如何,如果你需要这种语法,那么正确的 BNF 将是(你在第三个产生式上犯了一个拼写错误),

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

这对于 LR 解析器来说是正确的(底部-向上)。

对于 LL 解析器(自上而下),上述语法将导致 上的左递归。
要解决此问题,您应该对 LL 解析器使用以下语法:

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

Looks strange that you want to revert the precedence of multiplication over addition, but anyway if you need the grammar that way, then the correct BNF would be (you made a typo on the third production)

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

Which is right for an LR parser (bottom-up).

For a LL parser (top-down), the above grammar will cause left recursion on <expr> and <term>.
To workaround this issue, you should use this grammar for LL parsers:

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <term> * <expr> | <term>
<term>   -> <factor> + <term> | <factor>
<factor> -> ( <expr> ) | <id>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文