new error view

master
serr 2025-04-01 21:46:50 +03:00
parent 148e0e23c6
commit 8eabecb7b1
3 changed files with 70 additions and 36 deletions

View File

@ -1,72 +1,107 @@
%{ %{
#include "c_analyzer.tab.h" #include "c_analyzer.tab.h"
#include <string.h>
extern char* path;
int line_number = 1; 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) { void yyerror(const char *s) {
column_number--;
fprintf(stderr, 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, line_number,
column_number,
s, s,
yytext); 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); exit(-1);
} }
%} %}
%% %%
"{" { return LBRACE; } "{" { column_number += 1; return LBRACE; }
"}" { return RBRACE; } "}" { column_number += 1; return RBRACE; }
"(" { return LPAREN; } "(" { column_number += 1; return LPAREN; }
")" { return RPAREN; } ")" { column_number += 1; return RPAREN; }
";" { return SEMICOLON; } ";" { column_number += 1; return SEMICOLON; }
"=" { return ASSIGN; } "=" { column_number += 1; return ASSIGN; }
"+" { return PLUS; } "+" { column_number += 1; return PLUS; }
"-" { return MINUS; } "-" { column_number += 1; return MINUS; }
"*" { return MULT; } "*" { column_number += 1; return MULT; }
"/" { return DIV; } "/" { column_number += 1; return DIV; }
"%" { return MOD; } "%" { column_number += 1; return MOD; }
"&&" { return AND; } "&&" { column_number += 2; return AND; }
"||" { return OR; } "||" { column_number += 2; return OR; }
"!" { return NOT; } "!" { column_number += 1; return NOT; }
"<" { return LT; } "<" { column_number += 1; return LT; }
">" { return GT; } ">" { column_number += 1; return GT; }
"==" { return EQ; } "==" { column_number += 2; return EQ; }
"return" { return RET; } "return" { column_number += strlen("return"); return RET; }
"print" { return PRINT; } "print" { column_number += strlen("print"); return PRINT; }
"while" { return WHILE; } "while" { column_number += strlen("while"); return WHILE; }
"do" { return DO; } "do" { column_number += strlen("do"); return DO; }
"for" { return FOR; } "for" { column_number += strlen("for"); return FOR; }
"if" { return IF; } "if" { column_number += strlen("if"); return IF; }
"else" { return ELSE; } "else" { column_number += strlen("else"); return ELSE; }
"func" { return FUNC; } "func" { column_number += strlen("func"); return FUNC; }
"," { return COMMA; } "," { column_number += 1; return COMMA; }
"//" { "//" {
int c; int c;
while ((c = input()) != '\n' && c != 0); while ((c = input()) != '\n' && c != 0);
if (c == '\n') line_number++; if (c == '\n') {
line_number++;
column_number = 1;
}
} }
"/*" { "/*" {
int c, prev = 0; int c, prev = 0;
while ((c = input()) != 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; if (prev == '*' && c == '/') break;
prev = c; prev = c;
} }
if (c == 0) yyerror("Unterminated comment"); if (c == 0) yyerror("Unterminated comment");
} }
[0-9]+ { yylval.str = strdup(yytext); return NUMBER; } [0-9]+ { yylval.str = strdup(yytext); column_number += strlen(yytext); return NUMBER; }
[a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); column_number += strlen(yytext); return IDENTIFIER; }
[ \t] ; [ \t] { column_number++; }
\n { line_number++; } \n { line_number++; column_number = 1; }
. { yyerror("Invalid character"); } . { yyerror("Invalid character"); }
%% %%

View File

@ -8,6 +8,7 @@ extern char *yytext;
extern FILE *yyin; extern FILE *yyin;
bool debug = false; // debug mode bool debug = false; // debug mode
char* path;
%} %}
@ -128,8 +129,6 @@ expr:
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc > 1) { if (argc > 1) {
char* path;
// debug mode // debug mode
if (argc > 2) { if (argc > 2) {
path = argv[2]; path = argv[2];

View File

@ -5,7 +5,7 @@ func FUNC_1(a, b, c) {
} }
x = x + 1; x = x + 1;
a = a + 1; a = a + 1;;
} }
func FUNC_2() { func FUNC_2() {