Parsing 如何在简单语法中添加括号作为最高优先级?
我试图在语法中增加两个方面:Parsing 如何在简单语法中添加括号作为最高优先级?,parsing,grammar,context-free-grammar,parentheses,operator-precedence,Parsing,Grammar,Context Free Grammar,Parentheses,Operator Precedence,我试图在语法中增加两个方面: 一元减号,即“-”,和 括号 以下是我目前的语法: <comp> ::= <expr> | <comp> <op0> <expr> <expr> ::= <term> | <expr> <op1> <term> <term> ::= <darg> | <term> <op2> <darg&
<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> ::= * | /
::=|
::= |
::= |
::= |
::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
::= > | < | =< | => | =
::= + | -
::= * | /
我什么都试过了,但还是弄不明白。如何使一元减号处于最高优先级,然后是括号,然后是剩余的运算符(如所述)?将
更改为使用
而不是
,并定义
<fred> ::= -<fred> | (<comp>) | <darg>
::=-|()|
我正在添加一个名为
的新变量,在您当前的语法中添加三个新的产生式规则,以添加一元减号和括号
:
<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> ::= * | /
::=|
::= |
::= |
::= () | - |
::= |
::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
::= > | < | =< | => | =
::= + | -
::= * | /
通过添加括号,您在语法中添加了两个新的终端{(,)}
此外,如果要生成类似于表达式的(-7)
、(7)
和((6+7))
,则可以添加:=()
。(这些是有效的表达式)
我想告诉你们,若你们正在编写编译器,那个么就改用不明确的语法,并在YACC工具中添加操作符优先级,这将允许有效的解析
编辑:
如果您想添加像-(7)
这样的表达式,这是一个有效的表达式。因此::=-
而不是:=
@rici感谢您修复它。如果您不明白我为什么添加新变量,请告诉我。我希望这会有帮助。我不知道我的新非终点站应该放在哪里。你做的很有道理,谢谢!
的第二个选项不应该是-
,这样括号内的表达式就可以被求反吗?@ebohlman是的,如果您想添加像-(7)
这样的表达式,那么这是一个有效的表达式。所以用::=-
代替::=
就好了