2016-03-04 93 views
0

我想爲算術運算和一元運算符編寫野牛表達式。爲一元運算符的規則應當是野牛一元運算符的規則

--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它被接受,而它不應該被接受。這個問題發生在+和 - 操作中。

有誰知道如何解決它

+0

'3--4'是有效的。它是3二進制減一元減4.這裏沒有問題要解決。 'pre'通常被稱爲'primary',而你稱之爲'term'的確是'factor',等等。看看任何標準編程語言的語法。 – EJP

回答

1

你的語法有:

expr: expr '-' term 
term: pre 
pre : '-' factor 

所以3--4必須接受; -4減少到pre,然後term,然後3--4已變成expr - term,減少到expr

同樣-3*4將減少-3pre然後term,在這之後它可用於減少-3*4term,通過使用term: term '*' factor

我不清楚爲什麼你要3--4無效,而你願意接受-3-4以及-3*43--4不是,imho,或多或少會比其他兩個混淆,並且不會產生任何含糊之處。

但如果這是你想要的,你可以通過區分term S的可以是一元表達式實現它,而那些不能(未經測試):

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 ')' 
+0

非常感謝你的完美工作。這種某種語言的算術運算編譯器。假設是這種操作不被接受。 – Hukh

+0

@Hukh爲什麼不呢?它在我用過的每種編程語言以及我學過的每一個數學分支中都被接受。我相信你對此錯了。 – EJP