From dd5fd7e6a79c21e0e0c0bccab4ccef58feb52ffc Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 1 Apr 2025 19:50:37 +0300 Subject: [PATCH] &&,||,! added --- analyzers/c_analyzer/c_analyzer.l | 3 +++ analyzers/c_analyzer/c_analyzer.y | 10 ++++++++-- code.txt | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index 77cfbdb..edaf2eb 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -27,6 +27,9 @@ void yyerror(const char *s) { "*" { return MULT; } "/" { return DIV; } "%" { return MOD; } +"&&" { return AND; } +"||" { return OR; } +"!" { return NOT; } "return" { return RET; } "print" { return PRINT; } "while" { return WHILE; } diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index b072846..5ab48b2 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -16,10 +16,13 @@ bool debug = false; // debug mode } %token 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 expr program statement block +%left OR +%left AND +%right NOT %left PLUS MINUS %left MULT DIV MOD %right UNARY @@ -71,7 +74,10 @@ expr: | expr MULT { if (debug) printf("MULT\n") } expr // выражения вида expr*expr | expr DIV { if (debug) printf("DIV\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); } | NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); } ; diff --git a/code.txt b/code.txt index 71dfaf3..3ebf332 100644 --- a/code.txt +++ b/code.txt @@ -1,7 +1,7 @@ { x = 2 + 1 % 1; - if (x) { + if (!x && 1 || (x + (-100))) { x = 3; if (x) { x = 5;