/** logicalOr ::= logicalAnd OR logicalAnd */ private Value logicalOr() { Value res = logicalAnd(); while (token.getType() == TokenType.OR) { Value operand = logicalAnd(); res.setBooleanValue(res.getBooleanValue() || operand.getBooleanValue()); } return res; }
/** logicalAnd ::= equality AND equality */ private Value logicalAnd() { Value res = equality(); while (token.getType() == TokenType.AND) { Value operand = equality(); res.setBooleanValue(res.getBooleanValue() && operand.getBooleanValue()); } return res; }
/** * unary ::= NUMBER unary ::= OPEN logicalOr CLOSE unary ::= VARIABLE unary ::= NOT unary unary * ::= SUB unary unary ::= ADD unary */ private Value unary() { final Value res; nextToken(); if (token.getType() == TokenType.SUB) { res = unary(); return res.setValue(-res.getValue()); } else if (token.getType() == TokenType.ADD) { return unary(); } else if (token.getType() == TokenType.NOT) { res = unary(); return res.setBooleanValue(!res.getBooleanValue()); } else if (token.getType() == TokenType.OPEN) { res = logicalOr(); if (token.getType() != TokenType.CLOSE) { throw expected(TokenType.CLOSE); } } else if (token.getType() == TokenType.NUMBER) { res = token.getValue(); } else if (token.getType() == TokenType.VARIABLE) { // resolve variable res = variables.get(token.getStr()); if (res == null) { throw new IllegalStateException("Unexpected variable name"); } } else { throw expected( TokenType.SUB, TokenType.ADD, TokenType.NOT, TokenType.OPEN, TokenType.NUMBER, TokenType.VARIABLE); } nextToken(); return res; }