我试图为算术运算和一元运算符编写bison表达式。一元运算符的规则应该是
-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,它被接受了,而它不应该被接受。这个问题只发生在+和-操作中.
有人知道如何解决这个问题吗?
发布于 2016-03-04 06:02:47
你的语法有:
expr: expr '-' term
term: pre
pre : '-' factor因此,必须接受3-4;-4被还原为pre,然后是term,然后3--4变成了expr - term,这就变成了expr。
类似地,-3*4会将-3还原为pre,然后再将term还原为term,之后可以使用term: term '*' factor将-3*4还原为term。
我不清楚为什么您希望3--4无效,而您既愿意接受-3-4也愿意接受-3*4。3--4与其他两家公司相比,并没有多少令人困惑,也不会产生任何歧义。
但是,如果这是您想要的,您可以通过区分terms (可以是一元表达式)和那些不能(未经测试的)表达式来实现:
expr : expr '+' rterm
| expr '-' rterm
| term
rterm: term '*' factor
| term '/' factor
| term '%' factor
| factor
term : rterm | pre
pre : '-' factor | '+' factor
factor: VAR | CONST | '#' factor | '(' expr ')'https://stackoverflow.com/questions/35788716
复制相似问题