From 85ac25418924211d69dab64c8c02f18739213b75 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 1 Apr 2025 19:14:20 +0300 Subject: [PATCH] if/else added --- analyzers/c_analyzer/c_analyzer.l | 2 ++ analyzers/c_analyzer/c_analyzer.y | 10 ++++++++-- code.txt | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index 1640cae..77cfbdb 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -30,6 +30,8 @@ void yyerror(const char *s) { "return" { return RET; } "print" { return PRINT; } "while" { return WHILE; } +"if" { return IF; } +"else" { return ELSE; } [0-9]+ { yylval.str = strdup(yytext); return NUMBER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } [ \t] ; diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 28e5238..53ed1b6 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 +%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE IF ELSE %type expr program statement block @@ -31,15 +31,21 @@ program: | program statement ; -// Утверждение - либо блок {...}, либо выражение с ; в конце +// Утверждение - либо блок {...}, либо выражение с ; в конце, либо цикл while, либо конструкций if-else statement: { if (debug) printf("\033[93mANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON + | block + | WHILE { if (debug) printf("\033[1;34mWHILE LOOP DETECTED\033[0m\n"); } LPAREN expr RPAREN { if (debug) printf("\033[1;34mWHILE BODY STARTS\033[0m\n"); } block { if (debug) printf("\033[1;34mWHILE LOOP ENDED\033[0m\n"); } + + | IF LPAREN expr RPAREN block + + | IF LPAREN expr RPAREN block ELSE block ; // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { } diff --git a/code.txt b/code.txt index d33e926..71dfaf3 100644 --- a/code.txt +++ b/code.txt @@ -1,5 +1,19 @@ { x = 2 + 1 % 1; + + if (x) { + x = 3; + if (x) { + x = 5; + } + } else { + x = 5; + } + + if (x) { + x = 3; + } + x = z + 3 + 5; { x = -10;