%{ #include void yyerror(const char *s); extern int yylex(); extern char *yytext; extern FILE *yyin; %} %union { char *str; } %token IDENTIFIER NUMBER %token LBRACE RBRACE SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT %type expr program statement block %% // Program - последовательность утверждений program: | program statement ; // Утверждение - либо блок {...}, либо выражение с ; в конце statement: { printf("\033[93m\nANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON | block ; // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { } block: LBRACE program RBRACE ; // Возможные выражения expr: RET expr // выражение вида return expr | PRINT expr // выражение вида print expr | IDENTIFIER ASSIGN expr // выражения вида a=expr | expr PLUS expr // выражения вида expr+expr | expr MINUS expr // выражения вида expr-expr | expr MULT expr // выражения вида expr*expr | expr DIV expr // выражения вида expr/expr | expr MOD expr // выражения вида expr%expr | IDENTIFIER { printf("IDENTIFIER = %s\n", $1); free($1); } | NUMBER { printf("NUMBER = %s\n", $1); free($1); } ; %% int main(int argc, char **argv) { if (argc > 1) { FILE *f = fopen(argv[1], "r"); if (!f) { perror("\033[91mFail open file\033[0m"); return 1; } yyin = f; } yyparse(); printf("\033[92m\nSuccess parsed!\033[0m"); return 0; }