%{ #include "c_analyzer.tab.h" #include extern char* path; int line_number = 1; int column_number = 1; int error_count = 0; char* read_line(int line_number) { FILE *file = fopen(path, "r"); char buffer[1024]; int current_line = 0; while (fgets(buffer, 1024, file) != NULL) { if (current_line == line_number) { return strdup(buffer); } memset(buffer, 1024, 0); current_line++; } return NULL; } void yyerror(const char *s) { column_number--; fprintf(stderr, "\033[91m\nError at line %i, column %i: %s near '%s'\n", line_number, column_number, s, yytext); fprintf(stderr, "%s", read_line(line_number - 1)); for (int i = 0; i < column_number - 1; ++i) fprintf(stderr, "%c", ' '); fprintf(stderr, "%c\033[0m", '^'); error_count++; } %} %% "{" { column_number += 1; return LBRACE; } "}" { column_number += 1; return RBRACE; } "(" { column_number += 1; return LPAREN; } ")" { column_number += 1; return RPAREN; } ";" { column_number += 1; return SEMICOLON; } "=" { column_number += 1; return ASSIGN; } "+" { column_number += 1; return PLUS; } "-" { column_number += 1; return MINUS; } "*" { column_number += 1; return MULT; } "/" { column_number += 1; return DIV; } "%" { column_number += 1; return MOD; } "&&" { column_number += 2; return AND; } "||" { column_number += 2; return OR; } "!" { column_number += 1; return NOT; } "<" { column_number += 1; return LT; } ">" { column_number += 1; return GT; } "==" { column_number += 2; return EQ; } "return" { column_number += strlen("return"); return RET; } "print" { column_number += strlen("print"); return PRINT; } "while" { column_number += strlen("while"); return WHILE; } "do" { column_number += strlen("do"); return DO; } "for" { column_number += strlen("for"); return FOR; } "if" { column_number += strlen("if"); return IF; } "else" { column_number += strlen("else"); return ELSE; } "func" { column_number += strlen("func"); return FUNC; } "," { column_number += 1; return COMMA; } "//" { int c; while ((c = input()) != '\n' && c != 0); if (c == '\n') { line_number++; column_number = 1; } } "/*" { int c, prev = 0; while ((c = input()) != 0) { if (c == '\n') { line_number++; column_number = 1; } else { column_number++; } if (prev == '*' && c == '/') break; prev = c; } if (c == 0) yyerror("Unterminated comment"); } [0-9]+ { yylval.str = strdup(yytext); column_number += strlen(yytext); return NUMBER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); column_number += strlen(yytext); return IDENTIFIER; } [ \t] { column_number++; } \n { line_number++; column_number = 1; } . { yyerror("Invalid character"); } %% int yywrap() { return 1; }