Bison中用作前缀和posfix的运算符inc dec的问题

时间:2018-10-30 20:34:41

标签: c operator-keyword bison prefix

我在操作员管理方面遇到一些问题 增加和减少(前缀和后缀) 使用Flex / Bison,下面是另一个答案:

How to fix YACC shift/reduce conflicts from post-increment operator?

我读到最好的解决方案似乎是将它们声明为%nonassoc 或在某些情况下使用%right,我有些困惑:

插入这些参数,我期望得到这些结果:

 1 + ++1 ;  // 3
 1 + 1++ ;  // 2
 1 + --1 ;  // 1
 1 + 1-- ;  // 2

但是我收到此作为输出:

1-3
2-3
2-3
2-3

我将发布我使用的来源:

...

%right  tplus tmin 
%nonassoc tINC tDEC      

...

%type<integer> expr program

%%

program: expr tPV           {printf ( "1-%d\n",$$); }
    | program expr tPV      {printf ( "2-%d\n",$$); }
    ;


expr: tINTEGER               { $$ = $1; }
    | expr tPLUS expr           { $$ = $1 + $3; }
    | expr tMIN expr            { $$ = $1 - $3; }
    | expr tMUL expr            { $$ = $1 * $3; }
    | expr tDIV expr            { $$ = $1 / $3; }
    | expr tMOD expr            { $$ = $1 % $3; }

    | tPLUS expr  %prec tplus     { $$ =  $2; }
    | tMIN  expr  %prec tmin      { $$ = -$2; }

    | tINC expr                   { $$ = ++$2;    }
    | expr tINC                   { $$ =  $1++;   }
    | tDEC expr                   { $$ = --$2;    }
    | expr tDEC                   { $$ =  $1--;   }

    | tP0 expr tP1                { $$ =  $2; }
    ;

%%

能给我一些建议吗? 提前致谢 克劳迪奥

解决方案

program: line
    | program line
    ;
line: tPV { } 
    | expr tPV { printf("\n[%d]\n", $1); }
    ;

错误不是语法错误,而是非终止错误!

输出:

main.exe < prova.txt

[3]

[2]

[1]

[2]

0 个答案:

没有答案