if/else added
parent
0383536363
commit
85ac254189
|
@ -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] ;
|
||||
|
|
|
@ -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 }, т.е. это последовательность утверждений и она находится в скобках { }
|
||||
|
|
Loading…
Reference in New Issue