ExprPtr Parser::expressionRest(ExprPtr lhs, int minpred, bool se) { while(firstExpressionRest[token]) { Token op = token; int pred = operatorPrecedence[op]; if(pred < minpred) break; next(false); ExprPtr rhs(primaryExpression(se)); while(firstExpressionRest[token]) { Token op2 = token; int pred2 = operatorPrecedence[op2]; if(pred2 <= pred) break; rhs = expressionRest(rhs, pred2, se); } lhs = inScope(new BinExpr(lhs, rhs, op)); } return lhs; }
ExprPtr Parser::patternMatch(bool se) { expect(TCase); auto const& value = primaryExpression(false); expect(TLBrace); IntrusiveRefCntPtr<MatchExpr> matchExpr(new MatchExpr(value)); do { if(token == TTypeIdent || token == TIdent) // TODO: firstPattern set { enterScope(new Scope); auto pt = pattern(false); // TODO: Allow pattern = expr auto body = exitScope<Expr>(block(true)); matchExpr->legs.push_back(MatchLeg(pt, body)); } } while(test(TSemicolon)); expect(TRBrace, se); return ExprPtr(matchExpr.getPtr()); // TEMP }
// FIXME: don't discard the qualifier in namespace definitions void Parser::namespaceDefinition(int flags, Qualifier* /*qual*/) { uint32_t pos = position(); if (!(flags & (SFLAG_Function|SFLAG_Toplevel))) // no classes yet... compiler->syntaxError(pos, SYNTAXERR_KWD_NOT_ALLOWED, "namespace"); eat(T_Identifier); Str * name = identifier(); if (match(T_Assign)) { if (hd() == T_Identifier || hd() == T_StringLiteral) addNamespaceBinding(name, primaryExpression()); else compiler->syntaxError(pos, SYNTAXERR_ILLEGAL_NAMESPACE); } else addNamespaceBinding(name, NULL); semicolon(); }
// FIXME: don't discard the qualifier in namespace definitions void Parser::namespaceDefinition(int flags, Qualifier* /*qual*/) { uint32_t pos = position(); if (!(flags & (SFLAG_Function|SFLAG_Toplevel))) // no classes yet... compiler->syntaxError(pos, "'namespace' definition not allowed here"); eat(T_Identifier); Str * name = identifier(); if (match(T_Assign)) { if (hd() == T_Identifier || hd() == T_StringLiteral) addNamespaceBinding(name, primaryExpression()); else compiler->syntaxError(pos, "Illegal 'namespace' definition"); } else addNamespaceBinding(name, NULL); semicolon(); }
ExprPtr Parser::expression(bool se) { return expressionRest(primaryExpression(se), 0, se); }