public static new EXPRESSION parse(Token first, iSCOPE context) { EXPRESSION result = ADDITIVE.parse(first, context); Token token = get(); switch (token.code) { case TokenCode.Less: case TokenCode.LessEqual: case TokenCode.Greater: case TokenCode.GreaterEqual: case TokenCode.Equal: case TokenCode.NotEqual: case TokenCode.EqualEqual: case TokenCode.NotEqualDeep: forget(); break; case TokenCode.In: forget(); EXPRESSION left = EXPRESSION.parse(null, context); token = get(); if (token.code == TokenCode.DotDot) { forget(); EXPRESSION right = EXPRESSION.parse(null, context); RANGE_TYPE range = new RANGE_TYPE(left, right); range.setSpan(left.span, right.span); Span start = result.span; IN_EXPRESSION r = new IN_EXPRESSION(token, result, range); result.parent = r; result = r; result.setSpan(start, range.span); goto Out; } else { // Something's wrong: right part of the in-expression // should always be a range-type goto Out; } default: goto Out; } EXPRESSION second = ADDITIVE.parse(null, context); Span start2 = result.span; result = new RELATIONAL(token, result, second); result.setSpan(start2, second.span); Out: return(result); }
public static new EXPRESSION parse(Token first, iSCOPE context) { EXPRESSION result = MULTIPLICATIVE.parse(first, context); while (true) { Token token = get(); switch (token.code) { case TokenCode.Plus: case TokenCode.Minus: forget(); break; default: goto Out; } EXPRESSION second = MULTIPLICATIVE.parse(null, context); Span start = result.span; result = new ADDITIVE(token, result, second); result.setSpan(start, second.span); } Out: return(result); }