我想爲算術運算和一元運算符編寫野牛表達式。爲一元運算符的規則應當是野牛一元運算符的規則
--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二進制減一元減4.這裏沒有問題要解決。 'pre'通常被稱爲'primary',而你稱之爲'term'的確是'factor',等等。看看任何標準編程語言的語法。 – EJP