我在计算源在这里 http://epaperpress.com/lexandyacc/

我看看这些线条,在计算。y

| expr '+' expr         { $$ = opr('+', 2, $1, $3); }
| expr '-' expr         { $$ = opr('-', 2, $1, $3); }
| expr '*' expr         { $$ = opr('*', 2, $1, $3); }
| expr '/' expr         { $$ = opr('/', 2, $1, $3); }
| expr '<' expr         { $$ = opr('<', 2, $1, $3); }
| expr '>' expr         { $$ = opr('>', 2, $1, $3); }

有没有办法向组他们吗?所以我可以写一些东西喜欢在下面呢?

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

注:我使用野牛。

有帮助吗?

解决方案

将它们分组的问题在于你失去了规则的优先级 - 你只有一个规则具有不同的优先级,具体取决于它是哪个mathop,哪个bison / yacc无法处理。也就是说,您可以将具有相同优先级的操作组合在一起

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: '*' { $ = '*'; }
     | '/' { $ = '/'; }
;

其他提示

你可以做到这2种方式:

  • 在lex阶段定义认识的运营商,并提供终端符号(在你语法mathOp)与价值的运营商'+','-'...
  • 使用mathOp作为非终结符您可以返回的一些相关的价值:

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

然后使用情况看起来像(注意到2美元):

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

可能你会喜欢的定义更加复杂mathOp然后使用%的类型

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top