如何在简单语法中添加括号作为最高优先级?

Posted

技术标签:

【中文标题】如何在简单语法中添加括号作为最高优先级?【英文标题】:How can I add parentheses as the highest level of precedence in a simple grammar? 【发布时间】:2013-01-11 08:40:43 【问题描述】:

我正在尝试在我的语法中添加两件事:

    一元减号,即“-”和

    括号

这是我目前的语法:

<comp>  ::= <expr> | <comp> <op0> <expr>
<expr>  ::= <term> | <expr> <op1> <term>
<term>  ::= <darg> | <term> <op2> <darg>
<darg>  ::= <digit> | <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0>   ::= > | < | =< | => | =
<op1>   ::= + | -
<op2>   ::= * | /

我已经尝试了所有方法,但无法解决这个问题。如何使一元减号处于最高优先级,然后是括号,然后是描述的其余运算符?

【问题讨论】:

【参考方案1】:

&lt;term&gt; 更改为使用&lt;fred&gt; 而不是&lt;darg&gt; 并定义

<fred> ::= -<fred> | (<comp>) | <darg>

【讨论】:

@rici 感谢您修复它。【参考方案2】:

我正在添加一个名为 &lt;new&gt; 的新变量在您当前的语法中添加三个新的生产规则,以添加 Unary minus signParentheses

<comp>  ::= <expr>   | <comp> <op0> <expr>
<expr>  ::= <term>   | <expr> <op1> <term>
<term>  ::= <new>    | <term> <op2> <darg>
<new>   ::= (<comp>) | -<darg> | <darg> 
<darg>  ::= <digit>  |  <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0>   ::= > | < | =< | => | =
<op1>   ::= + | -
<op2>   ::= * | /

通过添加括号,您将在语法中添加两个新终端 (, )

另外,如果你想生成(-7)(7)((6+7))这样的表达式,你可以添加&lt;new&gt; ::= ( &lt;new&gt; )。(这些是有效的表达式

我想通知您,如果您正在编写编译器,请改用歧义语法并在 YACC 工具中添加运算符优先级,以便高效解析

编辑

如果你想添加像-(7) 这样的表达式,那是一个有效的表达式。所以&lt;new&gt; ::= -&lt;new&gt; 而不是&lt;new&gt; ::= &lt;drag&gt;

【讨论】:

如果您不明白我为什么要添加新变量,请告诉我。我希望它会有所帮助 我不确定在哪里放置我的新非终端。你所做的很有意义,谢谢! 不应该 &lt;new&gt; 的第二个选择是 -&lt;new&gt; 以便可以否定带括号的表达式吗? @ebohlman 是的,如果你想添加像-(7) 这样的表达式,那是一个有效的表达式。所以&lt;new&gt; ::= -&lt;new&gt; 而不是&lt;new&gt; ::= &lt;drag&gt; 那好

以上是关于如何在简单语法中添加括号作为最高优先级?的主要内容,如果未能解决你的问题,请参考以下文章

函数及其参数应用

excel中公式中运算符的优先级

() 优先级最高,为啥会短路?

表达式转换 (25 分)

Python --007--元祖

用正则表达式实现的计算器