【发布时间】:2016-03-04 05:33:42
【问题描述】:
我正在尝试为算术运算和一元运算符编写野牛表达式。一元运算符的规则应该是
--6 不被接受,但 -(-6) 被接受
不接受 4--5 和 4+-5,但接受 4-(-5)
不接受 4*-5 和 4/-5,但接受 4*(-5)
3- 不被接受
-3*4 被接受
规则是
line
: assign '\n' {
long temp=eval($1);
LIST_EXPR[count-1].value=temp;
LIST_EXPR[count-1].flag=1;
printf(" %ld\n", LIST_EXPR[count-1].value);
}
;
assign
: VAR '=' expr { $$ = make_binop(EQUAL, BINOP_EXPR, make_var($1), $3); add_to_list_expr($3,count); count++;}
| expr {add_to_list_expr($1,count); count++;}
;
expr
: expr '+' term { $$ = make_binop(PLUS,BINOP_EXPR, $1, $3);}
| expr '-' term { $$ = make_binop(MINUS,BINOP_EXPR, $1, $3);}
| term
;
term
: term '*' factor { $$ = make_binop(TIME,BINOP_EXPR, $1, $3);}
| term '/' factor { $$ = make_binop(DIV,BINOP_EXPR, $1, $3); }
| term '%' factor { $$ = make_binop(MOD,BINOP_EXPR, $1, $3); }
| factor
| pre
;
pre:
'-' factor {$$=make_binop(UMINUS,BINOP_EXPR, $2, NULL);}
| '+' factor {$$=make_binop(UPLUS,BINOP_EXPR, $2, NULL);}
;
factor
: '(' expr ')' { $$ = $2; }
| CONST { $$ = make_const($1); }
| VAR { $$ = make_var($1); }
| '#' factor {$$=make_binop(LINE_REF,BINOP_EXPR, $2, NULL);}
;
问题是当一元出现在右侧时它被接受,例如3--4它被接受,而它不应该被接受。这个问题只发生在 + 和 - 操作中。
有人知道怎么解决吗
【问题讨论】:
-
3--4有效。它是 3 binary-minus-unary-minus 4。这里没有问题要解决。pre通常被称为primary,而你所说的term实际上是factor,等等。看看任何标准编程语言的语法。
标签: parsing compiler-errors compiler-construction bison