我在學習yacc,而我從書中得到的這段代碼似乎並沒有正確應用優先規則。優先規則在Yacc中不起作用
這裏的YACC文件:
%{
#include <stdio.h>
extern int yylex();
void yyerror (char const *msg);
%}
%token NAME NUMBER
%left '+' '-'
%left '*' '/'
%%
statement: NAME '=' expression
| expression { printf("= %d\n", $1); }
;
expression: expression '+' NUMBER { $$ = $1 + $3; }
| expression '-' NUMBER { $$ = $1 - $3; }
| expression '*' NUMBER { $$ = $1 * $3; }
| expression '/' NUMBER { if ($3) $$ = $1/$3;
else yyerror("divide by zero"); }
| '-' expression { $$ = -$2; }
| '(' expression ')' { $$ = $2; }
| NUMBER { $$ = $1; }
;
%%
這裏的法:
%{
#include "y.tab.h"
#include <stdio.h>
extern int yylval;
%}
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
[ \t] { ; }
\n { return 0; }
. { return yytext[0]; }
%%
我編譯:
lex foo.l
yacc -d foo.y
clang -o foo lex.yy.c y.tab.c -ly -ll
運行它乘法首先給出正確的答案:
> ./foo
3 * 2 + 1
= 7
但當乘法發生第二次,它給出錯誤的答案:
> ./foo
4 + 5 * 2
= 18
添加線%left '+' '-'
和%left '*' '/'
在YACC文件理應解決這個問題,但他們沒有。誰能告訴我爲什麼?