我是Lex新手& Yacc編程,剛開始學習語法。我在網上瀏覽了這個程序,並試圖理解它。以下是Lex和Yacc代碼片段一個簡單的計算器:用Lex和Yacc解析(簡單計算器)
萊克斯規則:
%%
[a-z] {
yylval = *yytext - 'a';
return VARIABLE;
}
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+()=/*\n] { return *yytext; }
[ \t] ;
. yyerror("invalid character");
%%
YACC語法:
%%
program:
program statement '\n'
|
;
statement:
expr { printf("%d\n", $1); }
| VARIABLE '=' expr { sym[$1] = $3; }
;
expr:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1/$3; }
| '(' expr ')' { $$ = $2; }
;
%%
誰能請幫助我理解一步步驟如何處理/分析輸入表達式x = 3 + 4
?
按我的理解,在處理輸入,「x
」將返回變而3
,5
和4
會由Lex INTEGER返回。然而,在Yacc中,按照語法,由於VARIABLE可以推導爲expr,因此表達式將變爲:expr = expr '+' expr
那麼如何減少這個值得到VARIABLE '=' expr { sym[$1] = $3; }
?
任何幫助表示讚賞。
謝謝
啓用[野牛的跟蹤工具](https://www.gnu.org/software/bison/manual/bison.html#Tracing),您可以一步一步觀察所有情況。 – rici