我在操作员管理方面遇到一些问题 增加和减少(前缀和后缀) 使用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]