Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何在简单语法中添加括号作为最高优先级?_Parsing_Grammar_Context Free Grammar_Parentheses_Operator Precedence - Fatal编程技术网

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)
    这样的表达式,那么这是一个有效的表达式。所以用
    ::=-
    代替
    ::=
    就好了