【问题标题】:rules for unary operators in bison野牛中一元运算符的规则
【发布时间】: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


【解决方案1】:

你的语法有:

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

所以 3--4 必须被接受; -4 减少为pre,然后是term,然后3--4 变成了expr - term,减少为expr

同样-3*4-3 减少到pre 然后term,之后可以使用term: term '*' factor-3*4 减少到term

我不清楚为什么您希望3--4 无效,而您愿意接受-3-4 以及-3*43--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 ')'

【讨论】:

  • 非常感谢您完美地工作。这是某种语言的算术运算的某种编译器。并且假设是这种操作不被接受。
  • @Hukh 为什么不呢?它被我用过的每一种编程语言和我研究过的每一个数学分支所接受。我确定你错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多