Yacc/Bison, minimize amount by grouping math ops

后端 未结 2 1057
抹茶落季
抹茶落季 2020-12-21 04:24

I am looking at the calc source here http://epaperpress.com/lexandyacc/

I see theses lines in calc.y

| expr \'+\' expr         { $$ = opr(\'+\', 2,          


        
相关标签:
2条回答
  • 2020-12-21 05:14

    The problem with grouping them like that is that you lose the precedences on the rules -- you only have one rule that has different precedence depending on which mathop it is, which bison/yacc cannot handle. That said, you CAN group ops of the same precedence level together

    expr: expr mulOp expr { $$ = opr($2, 2, $1, $3); } %prec '*'
        | expr addOp expr { $$ = opr($2, 2, $1, $3); } %prec '+'
        | expr relOp expr { $$ = opr($2, 2, $1, $3); } %prec '<'
                 :
    
    mulOp: '*' { $$ = '*'; }
         | '/' { $$ = '/'; }
    ;
    
    0 讨论(0)
  • 2020-12-21 05:18

    You can do it in 2 ways:

    • At lex stage define recognition of operators and provide terminal symbol (in you syntax mathOp) with value of operator '+', '-' ...
    • Using mathOp as nonterminal you can return some associated value:

      mathOp : '+' { $$ = '+'; } | '-' { $$ = '-'; } ...

    Then usage will look like (pay attention to $2):

    | expr mathOp expr         { $$ = opr($2, 2, $1, $3); }
    

    may be you would like to define more complicated mathOp then use %type

    0 讨论(0)
提交回复
热议问题