Я новичок в разборе. Ниже приведен фрагмент кода для синтаксического анализатора в Bison:Простой калькулятор в Bison
Parser.y:
%{
#include <stdio.h>
%}
/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL
%%
calclist: /* nothing */
| calclist exp EOL { printf("= %d\n", $1); }
;
exp: factor
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor: term
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1/$3; }
;
term: NUMBER
| ABS term { $$ = $2 >= 0? $2 : - $2; }
;
%%
main(int argc, char **argv)
{ yyparse();
}
yyerror(char *s)
{ fprintf(stderr, "error: %s\n", s);
}
Я изо всех сил, чтобы понять, как строка ввода 10 - 3 * 2 + 6
будет анализироваться/обрабатывается придерживаясь оператора старшинства. Может кто-нибудь описать механизм разбора шаг за шагом? Напр.
Step1: 10 is read and token NUMBER is returned
Step2: etc....
Любая помощь приветствуется.
Спасибо.
вопрос - после того, как маркер ** 10 ** считывается из входного и получает сводится к 'ЧИСЛО -> термин -> factor', почему она не получить дополнительно сокращен до' exp' по правило 'exp: factor' (правило 7). Вместо этого он продолжает читать следующий токен (т. Е. «** - **»)? –
@Raj: Это уменьшает использование правила 7. Это ясно в трассировке. – rici