%{ #include #include #include extern int CURRENT_LINE_NUMBER; extern char *yytext; extern void yyerror(const char *s); extern int yylex(); extern FILE *yyin; void free_node(char *str) { if (str) free(str); } %} %union { char *str; } %token IDENTIFIER NUMBER TEXT %token ASSIGN LBRACE RBRACE %type expr %% program: | program expr | program block ; block: LBRACE content RBRACE ; content: | content TEXT { printf("TEXT: '%s'\n", $2); free_node($2); } | content block | content expr ; expr: IDENTIFIER ASSIGN NUMBER { printf("Assignment: %s := %s\n", $1, $3); free_node($1); free_node($3); } ; %% int main(int argc, char **argv) { if (argc > 1) { FILE *f = fopen(argv[1], "r"); if (!f) { perror("\033[91mFailed to open file\033[0m"); return 1; } yyin = f; } yyparse(); return 0; }