new error view
parent
148e0e23c6
commit
8eabecb7b1
|
@ -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"); }
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue