From 6b954531b3899a65b50f5e33b8900270026f75d0 Mon Sep 17 00:00:00 2001 From: serr Date: Sun, 30 Mar 2025 22:01:07 +0300 Subject: [PATCH] =?UTF-8?q?=D1=86=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/cpl/cpl.y | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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; }