From 62d7cd88408834b445ccb841a17987256c841400 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 1 Apr 2025 20:41:16 +0300 Subject: [PATCH] do-while added --- analyzers/c_analyzer/c_analyzer.l | 4 ++++ analyzers/c_analyzer/c_analyzer.y | 15 +++++++++++---- code.txt | 4 ++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index 23dd4c9..dd7f961 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -28,9 +28,13 @@ void yyerror(const char *s) { "&&" { return AND; } "||" { return OR; } "!" { return NOT; } + "return" { return RET; } "print" { return PRINT; } + "while" { return WHILE; } +"do" { return DO; } + "if" { return IF; } "else" { return ELSE; } diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 2ded099..b8cff1b 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -16,7 +16,7 @@ bool debug = false; // debug mode } %token IDENTIFIER NUMBER -%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE IF ELSE AND OR NOT +%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE DO IF ELSE AND OR NOT %token FUNC COMMA %type expr program statement block func_decl param_list params @@ -48,6 +48,13 @@ statement: block { if (debug) printf("\033[1;34mWHILE LOOP ENDED\033[0m\n"); } + | DO { if (debug) printf("\033[1;34mDO-WHILE LOOP DETECTED\033[0m\n"); } + block + WHILE + { printf("\033[1;34mDO-WHILE CONDITION DETECTED\033[0m\n"); } + LPAREN expr RPAREN SEMICOLON + { if (debug) printf("\033[1;34mDO-WHILE LOOP ENDED\033[0m\n"); } + | IF LPAREN expr RPAREN block { if (debug) printf("\033[1;34mIF BLOCK ENDED\033[0m\n"); } | IF LPAREN expr RPAREN block @@ -96,9 +103,9 @@ expr: | expr DIV { if (debug) printf("DIV\n") } expr // выражения вида expr/expr | expr MOD { if (debug) printf("MOD\n") } expr // выражения вида expr%expr | LPAREN { if (debug) printf("LPAREN\n") } expr RPAREN { if (debug) printf("RPAREN\n") } // выражения вида (expr) - | expr OR expr - | expr AND expr - | NOT expr + | expr OR { if (debug) printf("OR\n") } expr + | expr AND { if (debug) printf("AND\n") } expr + | NOT { if (debug) printf("NOT\n") } expr | IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); } | NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); } ; diff --git a/code.txt b/code.txt index 58c246f..cbbe4f8 100644 --- a/code.txt +++ b/code.txt @@ -4,6 +4,10 @@ func FUNC_1(a, b, c) { } func FUNC_2() { + do { + x = x + 1; + } while(!x); + x = 5; }