diff --git a/analyzers/cpl/cpl.y b/analyzers/cpl/cpl.y index 16bb7dd..3f828b5 100644 --- a/analyzers/cpl/cpl.y +++ b/analyzers/cpl/cpl.y @@ -4,6 +4,7 @@ #include extern int yylineno; +extern char *last_lexeme; void yyerror(const char *s); int yylex(); @@ -20,10 +21,12 @@ extern FILE *yyin; %token IF ELSE WHILE RETURN PRINT %token AND OR NOT GE LE EQ NE -%nonassoc '>' '<' GE LE EQ NE +%right '=' %left OR %left AND -%left '=' '+' '-' +%left EQ NE +%left '<' '>' GE LE +%left '+' '-' %left '*' '/' '%' %right NOT UMINUS @@ -74,13 +77,17 @@ expr: %% void yyerror(const char *s) { - fprintf(stderr, "\033[91mError at line %d: %s\n\033[0m", yylineno, s); + if (last_lexeme) { + fprintf(stderr, "\033[91mError at line %d: %s (near '%s')\n\033[0m", yylineno, s, last_lexeme); + } else { + fprintf(stderr, "\033[91mError at line %d: %s\n\033[0m", yylineno, s); + } exit(1); } int main(int argc, char *argv[]) { if (argc < 2) { - fprintf(stderr, "\033[91mUsage: <...>.exe \n\033[0m", argv[0]); + fprintf(stderr, "\033[91mUsage: %s \n\033[0m", argv[0]); return 1; }