diff --git a/parser/nodes.cc b/parser/nodes.cc index f4331e4..b2bedd4 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -116,6 +116,9 @@ NodeRef BinOpNode::evaluate() case '%': r = (int) o % (int) t; break; + case '^': + r = pow(o, t); + break; default: cerr << "Error: BinOpNode created with op '" << m_op << "'" << endl; exit(-3); @@ -125,9 +128,9 @@ NodeRef BinOpNode::evaluate() NodeRef BoolExpressionNode::evaluate() { - double o, t; + double o = 0, t = 0; double r = 0; - if (m_op != '!') + if (m_op != '!' && m_op != '&' && m_op != '|') { o = one->evaluate()->getNumber(); t = two->evaluate()->getNumber(); @@ -152,6 +155,20 @@ NodeRef BoolExpressionNode::evaluate() case 'n': r = o != t ? 1 : 0; break; + case '&': + r = one->evaluate()->getInteger(); + if (r != 0) + { + r = two->evaluate()->getInteger(); + } + break; + case '|': + r = one->evaluate()->getInteger(); + if (r == 0) + { + r = two->evaluate()->getInteger(); + } + break; case '!': r = ! one->evaluate()->getInteger(); break; diff --git a/parser/parser.lex b/parser/parser.lex index 19bdc5d..ad1bebe 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -19,6 +19,7 @@ \* return TIMES; \/ return DIVIDE; % return MOD; +\^ return POW; = return ASSIGN; == return EQUALS; != return NOTEQUALS; diff --git a/parser/parser.yy b/parser/parser.yy index e128fef..d47a941 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -38,6 +38,7 @@ refptr parser_scope; %token TIMES; %token DIVIDE; %token MOD; +%token POW; %token ASSIGN; %token EQUALS; %token NOTEQUALS; @@ -120,8 +121,10 @@ refptr parser_scope; %token LOCAL; %right ASSIGN +%left AND OR NOT %left PLUS MINUS %left TIMES DIVIDE MOD +%right POW %left UMINUS %% @@ -356,6 +359,7 @@ expression: term { $$ = $1; } | expression TIMES term { $$ = new BinOpNode('*', $1, $3); } | expression DIVIDE term { $$ = new BinOpNode('/', $1, $3); } | expression MOD term { $$ = new BinOpNode('%', $1, $3); } + | expression POW term { $$ = new BinOpNode('^', $1, $3); } | MINUS expression %prec UMINUS { $$ = new BinOpNode('-', new NumberNode(0.0), $2); } @@ -390,6 +394,12 @@ bool_expression: expression LESS expression { | expression NOTEQUALS expression { $$ = new BoolExpressionNode('n', $1, $3); } + | bool_expression AND bool_expression { + $$ = new BoolExpressionNode('&', $1, $3); + } + | bool_expression OR bool_expression { + $$ = new BoolExpressionNode('|', $1, $3); + } | NOT bool_expression { $$ = new BoolExpressionNode('!', $2, NULL); }