&&,||,! added

master
serr 2025-04-01 19:50:37 +03:00
parent 0cc677de1e
commit dd5fd7e6a7
3 changed files with 12 additions and 3 deletions

View File

@ -27,6 +27,9 @@ void yyerror(const char *s) {
"*" { return MULT; } "*" { return MULT; }
"/" { return DIV; } "/" { return DIV; }
"%" { return MOD; } "%" { return MOD; }
"&&" { return AND; }
"||" { return OR; }
"!" { return NOT; }
"return" { return RET; } "return" { return RET; }
"print" { return PRINT; } "print" { return PRINT; }
"while" { return WHILE; } "while" { return WHILE; }

View File

@ -16,10 +16,13 @@ bool debug = false; // debug mode
} }
%token <str> IDENTIFIER NUMBER %token <str> IDENTIFIER NUMBER
%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE IF ELSE %token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE IF ELSE AND OR NOT
%type <str> expr program statement block %type <str> expr program statement block
%left OR
%left AND
%right NOT
%left PLUS MINUS %left PLUS MINUS
%left MULT DIV MOD %left MULT DIV MOD
%right UNARY %right UNARY
@ -72,6 +75,9 @@ expr:
| expr DIV { if (debug) printf("DIV\n") } expr // выражения вида expr/expr | expr DIV { if (debug) printf("DIV\n") } expr // выражения вида expr/expr
| expr MOD { if (debug) printf("MOD\n") } expr // выражения вида expr%expr | expr MOD { if (debug) printf("MOD\n") } expr // выражения вида expr%expr
| LPAREN { if (debug) printf("LPAREN\n") } expr RPAREN { if (debug) printf("RPAREN\n") } // выражения вида (expr) | LPAREN { if (debug) printf("LPAREN\n") } expr RPAREN { if (debug) printf("RPAREN\n") } // выражения вида (expr)
| expr OR expr
| expr AND expr
| NOT expr
| IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); } | IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); }
| NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); } | NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); }
; ;

View File

@ -1,7 +1,7 @@
{ {
x = 2 + 1 % 1; x = 2 + 1 % 1;
if (x) { if (!x && 1 || (x + (-100))) {
x = 3; x = 3;
if (x) { if (x) {
x = 5; x = 5;