예제 #1
0
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;
}
예제 #2
0
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
}
예제 #3
0
파일: eval-parse.cpp 프로젝트: changm/tessa
 // 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();
 }
예제 #4
0
		// 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();
		}
예제 #5
0
ExprPtr Parser::expression(bool se)
{
	return expressionRest(primaryExpression(se), 0, se);
}