%{ #include #include #include extern int CURRENT_LINE_NUMBER; extern char *yytext; void yyerror(const char *s) { fprintf(stderr, "\033[91mError at line %i\033[0m", CURRENT_LINE_NUMBER); exit(1); } extern int yylex(); extern FILE *yyin; %} %union { char *str; } %token TEXT %token LBRACE RBRACE %% block: LBRACE content RBRACE ; content: | content TEXT { printf("TOKEN ('%s')\n", $2); free($2); } | content block ; %% int main(int argc, char **argv) { CURRENT_LINE_NUMBER = 1; if (argc > 1) { FILE *f = fopen(argv[1], "r"); if (!f) { perror("\033[91mFail open file\033[0m"); return 1; } yyin = f; } yyparse(); return 0; }