From 8eabecb7b101041b6c9ef98d5f7f94dfb340c4d1 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 1 Apr 2025 21:46:50 +0300 Subject: [PATCH] new error view --- analyzers/c_analyzer/c_analyzer.l | 101 ++++++++++++++++++++---------- analyzers/c_analyzer/c_analyzer.y | 3 +- code.txt | 2 +- 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index 784f8e8..7ed0d45 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -1,72 +1,107 @@ %{ #include "c_analyzer.tab.h" +#include + +extern char* path; int line_number = 1; +int column_number = 1; + +char* read_ith_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: %s near '%s'\033[0m\n", + "\033[91m\nError at line %i, column %i: %s near '%s'\n", line_number, + column_number, s, yytext); + fprintf(stderr, "%s", read_ith_line(line_number - 1)); + for (int i = 0; i < column_number - 1; ++i) fprintf(stderr, "%c", ' '); + fprintf(stderr, "%c\033[0m", '^'); exit(-1); } %} %% -"{" { return LBRACE; } -"}" { return RBRACE; } -"(" { return LPAREN; } -")" { return RPAREN; } -";" { return SEMICOLON; } -"=" { return ASSIGN; } -"+" { return PLUS; } -"-" { return MINUS; } -"*" { return MULT; } -"/" { return DIV; } -"%" { return MOD; } -"&&" { return AND; } -"||" { return OR; } -"!" { return NOT; } -"<" { return LT; } -">" { return GT; } -"==" { return EQ; } +"{" { 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" { return RET; } -"print" { return PRINT; } +"return" { column_number += strlen("return"); return RET; } +"print" { column_number += strlen("print"); return PRINT; } -"while" { return WHILE; } -"do" { return DO; } -"for" { return FOR; } +"while" { column_number += strlen("while"); return WHILE; } +"do" { column_number += strlen("do"); return DO; } +"for" { column_number += strlen("for"); return FOR; } -"if" { return IF; } -"else" { return ELSE; } +"if" { column_number += strlen("if"); return IF; } +"else" { column_number += strlen("else"); return ELSE; } -"func" { return FUNC; } -"," { return COMMA; } +"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++; + if (c == '\n') { + line_number++; + column_number = 1; + } } "/*" { int c, prev = 0; while ((c = input()) != 0) { - if (c == '\n') line_number++; + 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); return NUMBER; } -[a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } -[ \t] ; -\n { line_number++; } +[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"); } %% diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 42c6f7a..0396315 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -8,6 +8,7 @@ extern char *yytext; extern FILE *yyin; bool debug = false; // debug mode +char* path; %} @@ -128,8 +129,6 @@ expr: int main(int argc, char **argv) { if (argc > 1) { - char* path; - // debug mode if (argc > 2) { path = argv[2]; diff --git a/code.txt b/code.txt index d1c2c9a..ff4cd17 100644 --- a/code.txt +++ b/code.txt @@ -5,7 +5,7 @@ func FUNC_1(a, b, c) { } x = x + 1; - a = a + 1; + a = a + 1;; } func FUNC_2() {