while loop added

master
serr 2025-04-01 18:44:15 +03:00
parent 0810b7275c
commit fe86d2cc29
3 changed files with 12 additions and 3 deletions

View File

@ -29,6 +29,7 @@ void yyerror(const char *s) {
"%" { return MOD; } "%" { return MOD; }
"return" { return RET; } "return" { return RET; }
"print" { return PRINT; } "print" { return PRINT; }
"while" { return WHILE; }
[0-9]+ { yylval.str = strdup(yytext); return NUMBER; } [0-9]+ { yylval.str = strdup(yytext); return NUMBER; }
[a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; }
[ \t] ; [ \t] ;

View File

@ -12,7 +12,7 @@ extern FILE *yyin;
} }
%token <str> IDENTIFIER NUMBER %token <str> 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 <str> expr program statement block %type <str> expr program statement block
@ -29,8 +29,13 @@ program:
// Утверждение - либо блок {...}, либо выражение с ; в конце // Утверждение - либо блок {...}, либо выражение с ; в конце
statement: statement:
{ printf("\033[93m\nANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON { printf("\033[93mANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON
| block | 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 }, т.е. это последовательность утверждений и она находится в скобках { } // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { }

View File

@ -4,10 +4,13 @@
{ {
x = -10; x = -10;
y = (x + +5) % 2; y = (x + +5) % 2;
{ while (x + 1) {
z = y * +2 / -(5 * ( ((3)) )); z = y * +2 / -(5 * ( ((3)) ));
} }
} }
print x; print x;
while (1) {
x = x + 1;
}
return x / 2 + 5; return x / 2 + 5;
} }