diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index f746144..1640cae 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -29,6 +29,7 @@ void yyerror(const char *s) { "%" { return MOD; } "return" { return RET; } "print" { return PRINT; } +"while" { return WHILE; } [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 ec4451a..5100365 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -12,7 +12,7 @@ extern FILE *yyin; } %token IDENTIFIER NUMBER -%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT +%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE %type expr program statement block @@ -29,8 +29,13 @@ program: // Утверждение - либо блок {...}, либо выражение с ; в конце statement: - { printf("\033[93m\nANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON + { printf("\033[93mANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON | block + | WHILE { printf("\033[1;34m>>> WHILE LOOP DETECTED\033[0m\n"); } + LPAREN expr RPAREN + { printf("\033[1;34m>>> WHILE BODY STARTS\033[0m\n"); } + block + { printf("\033[1;34m>>> WHILE LOOP ENDED\033[0m\n"); } ; // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { } diff --git a/code.txt b/code.txt index 5d8d04b..d33e926 100644 --- a/code.txt +++ b/code.txt @@ -4,10 +4,13 @@ { x = -10; y = (x + +5) % 2; - { + while (x + 1) { z = y * +2 / -(5 * ( ((3)) )); } } print x; + while (1) { + x = x + 1; + } return x / 2 + 5; } \ No newline at end of file