2016-03-04 94 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