2016-03-23 5 views
0

Я новичок в 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; }?

Любая помощь приветствуется.

Благодаря

+0

Включите [средство слежения за зубами] (https://www.gnu.org/software/bison/manual/bison.html#Tracing), и вы можете наблюдать за происходящим, шаг за шагом. – rici

ответ

2

x смещена; = сдвинут; 3,+,4 сдвинуты; то 3+4 соответствует производству сложения, которое сводится к expr, что позволяет сократить производство заданий. Вы должны помнить, что yacc - это анализатор снизу вверх.

+0

Существует также два сокращения правила 'expr: INTEGER' (сразу после смещения' 3' и '4'), которые являются просто простыми копиями значения. –

+0

ok получил это ... еще один вопрос - в чем разница между yylval & yytext? –

+0

@EJP: есть также это Производство: expr = VARIALBLE. Таким образом, при синтаксическом анализе выражение x = 3 + 4 не будет expr = expr + expr? Если да, то как это соотносится с производством VARIABLE = expr? так как VARIABLE уже сокращен до expr? –

Смежные вопросы