Я новичок в Lex & Программирование Yacc и только начало работы с грамматикой. Я курсирую по этой программе в сети и пытаюсь ее понять. Ниже приведены Lex и Yacc код-фрагменты для простого калькулятора:Разбор с Lex и Yacc (простой калькулятор)
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
» вернет ПЕРЕМЕННОЙ тогда 3
, 5
и 4
будут возвращены в INTEGER по Lex. Однако в Yacc в соответствии с грамматикой, поскольку переменная может быть выведена как expr, выражение будет выглядеть следующим образом: expr = expr '+' expr
Так как это будет уменьшено, чтобы получить VARIABLE '=' expr { sym[$1] = $3; }
?
Любая помощь приветствуется.
Благодаря
Включите [средство слежения за зубами] (https://www.gnu.org/software/bison/manual/bison.html#Tracing), и вы можете наблюдать за происходящим, шаг за шагом. – rici