| 76 | } |
| 77 | |
| 78 | bool ConditionalParser::notexpr(Expression& expr) |
| 79 | { |
| 80 | if (!match(TokenType::Not)) |
| 81 | return primarylogexpr(expr); |
| 82 | |
| 83 | // Matched ! |
| 84 | if (!primarylogexpr(expr)) |
| 85 | { |
| 86 | setError("Expected expression following '!'."); |
| 87 | return false; |
| 88 | } |
| 89 | |
| 90 | NodePtr sub = expr.popNode(); |
| 91 | if (sub->isValue()) |
| 92 | { |
| 93 | setError("Can't apply '!' to numeric value."); |
| 94 | return false; |
| 95 | } |
| 96 | expr.pushNode(NodePtr(new NotNode(NodeType::Not, std::move(sub)))); |
| 97 | return true; |
| 98 | } |
| 99 | |
| 100 | bool ConditionalParser::primarylogexpr(Expression& expr) |
| 101 | { |