【发布时间】:2021-06-04 05:03:13
【问题描述】:
我是 Lex 和 Yacc 编程的新手,刚刚开始学习语法。我在网上看到了这个程序,并一直试图理解它。以下是用于简单计算器的 Lex 和 Yacc 代码-sn-ps:
Lex 规则:
%%
[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' 将返回 VARIABLE,而 3、5 和 4 将返回为 INTEGER强 > 由莱克斯。但是,在 Yacc 中,根据语法,由于可以将 VARIABLE 推导出为 expr,因此表达式将变为:expr = expr '+' expr
那么这将如何减少得到VARIABLE '=' expr { sym[$1] = $3; }?
感谢任何帮助。
谢谢
【问题讨论】:
-
启用bison's trace facility,您可以一步步观看这一切。