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;