if/else added

master
serr 2025-04-01 19:14:20 +03:00
parent 0383536363
commit 85ac254189
3 changed files with 24 additions and 2 deletions

View File

@ -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] ;

View File

@ -16,7 +16,7 @@ bool debug = false; // debug mode
}
%token <str> 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 <str> 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 }, т.е. это последовательность утверждений и она находится в скобках { }

View File

@ -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;