首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >野牛一元操作规则

野牛一元操作规则
EN

Stack Overflow用户
提问于 2016-03-04 05:33:42
回答 1查看 977关注 0票数 0

我试图为算术运算和一元运算符编写bison表达式。一元运算符的规则应该是

-6不被接受,但-(-6)接受

4-5和4+-5不被接受,但4-(-5)接受

4*-5和4/-5未获接受,但4*(-5)接受

3-不接受

-接受3*4

规则是

代码语言:javascript
复制
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,它被接受了,而它不应该被接受。这个问题只发生在+和-操作中.

有人知道如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 06:02:47

你的语法有:

代码语言:javascript
复制
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*43--4与其他两家公司相比,并没有多少令人困惑,也不会产生任何歧义。

但是,如果这是您想要的,您可以通过区分terms (可以是一元表达式)和那些不能(未经测试的)表达式来实现:

代码语言:javascript
复制
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 ')'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35788716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档