%{ #include #include void yyerror(const char *s); int yylex(); %} // В Bison приоритет операторов определяется обратным порядком объявления // left означает левоассоциативность, т.е. вычисление 8/2/2/2 например производится слева направо %token NUMBER %left '+' '-' // т.е. операторы в этой строке имеют более низкий приотритет %left '*' '/' // нежели операторы в этой строке %% // Это правило отвечает за обработку потока выражений и вывод результатов. input: | input expr { printf("= %d\n", $2); } ; // $1 - значение первого операнда, $2 - оператор, а $3 - значение второго операнда expr: NUMBER { $$ = $1; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } ; %% void yyerror(const char *s) { fprintf(stderr, "ERROR: %s\n", s); } int main() { yyparse(); return 0; }