diff --git a/sources/zweic/Parser.scala b/sources/zweic/Parser.scala index 1e8223d..2dc61b0 100755 --- a/sources/zweic/Parser.scala +++ b/sources/zweic/Parser.scala @@ -296,62 +296,67 @@ /** * CmpExpression = [ SumExpression CompOp ] SumExpression - * MyCmpExpression = SumExpression [ CompOp SumExpression ] + * MyCmpExpression = SumExpression { CompOp SumExpression } */ private def cmpExpression(): Expr = { - val left = sumExpression(); - if ( token == EQ || token == NE || token == LT + var left = sumExpression(); + while ( token == EQ || token == NE || token == LT || token == GT || token == LE || token == GE ) { - val op = compOp(); - val right = sumExpression(); - return Binop(op, left, right); + var op = compOp(); + var right = sumExpression(); + left = Binop(op, left, right); } return left; } /** * SumExpression = Term | SumExpression SumOp Term - * MySumExpression = Term [ SumOp SumExpression ] + * MySumExpression = Term { SumOp Term } */ private def sumExpression(): Expr = { - val left = term(); - if ( token == ADD || token == SUB ) { - return Binop(sumOp(), left, sumExpression()); - } else { - if (check(OR)) { - var right = sumExpression(); - left.brackets = true; - right.brackets = true; - var bo = Binop(Operators.AND, Unop(Operators.NOT, left), Unop(Operators.NOT, right)); - bo.brackets = true; - return Unop(Operators.NOT, bo); + var left = term(); + + while ( token == ADD || token == SUB || token == OR ) { + if ( check(OR) ) { + var right = term(); + left.brackets = true; + right.brackets = true; + var bo = Binop(Operators.AND, Unop(Operators.NOT, left), Unop(Operators.NOT, right)); + bo.brackets = true; + left = Unop(Operators.NOT, bo); } else { - return left; + left = Binop(sumOp(), left, term()); } } + + return left; } /** * Term = [ Term ProdOp ] [ NegateOp ] Factor - * MyTerm = [ NegateOp ] Factor [ ProdOp Term ] + * MyTerm = [ NegateOp ] Factor { ProdOp [ NegateOp ] Factor } */ private def term(): Expr = { - var left:Expr = null; + var left:Expr = _negFactor(); + + while ( token == MUL || token == DIV || token == MOD || token == AND ) { + var op = prodOp(); + left = Binop(op, left, _negFactor()); + } + + return left; + } + + private def _negFactor(): Expr = if ( token == SUB || token == NOT ) { val op = Operators.token2op(token); nextToken; val e = factor(); - left = Unop(op, e); + e.brackets = true; + return Unop(op, e); } else { - left = factor(); + return factor(); } - if ( token == MUL || token == DIV || token == MOD || token == AND ) { - val op = prodOp(); - val right = term(); - return Binop(op, left, right); - } - return left; - } private def _string(str: String): New = { // TODO: make this less dirty