コード例 #1
0
ファイル: parse.c プロジェクト: shintoo/Saturn
/* Medium to create arguments from the token */
Arg * CreateArg(char *token) {
    Arg * newarg;

    if (token[0] == '\'') {
        newarg = CreateStringLiteral(token);
        return newarg;
    }
    if (isdigit(token[0]) || token[0] == '-') {
        newarg = CreateNumericLiteral(token);
        return newarg;
    }
    if (strchr("abcdefghijklmnopqrstuvwxyz_-", tolower(token[0])) == NULL) {
        ABORT("Illegal character beginning argument: %s", token);
    }

    newarg = CreateVarArg(token);
    return newarg;
}
コード例 #2
0
ファイル: ParserCommon.cpp プロジェクト: Twiebs/compiler00
ASTExpression* ParseExpr(MemoryArena* arena, Lexer* lex) {
	auto parsePrimary = [](MemoryArena* arena, Lexer* lex) -> ASTExpression* {
		switch (lex->token.type) {
		case TOKEN_TRUE:
		{
			lex->nextToken();
			return CreateIntegerLiteral(arena, 1);
		}
		case TOKEN_FALSE:
		{
			lex->nextToken();
			return CreateIntegerLiteral(arena, 0);
		}
		case TOKEN_STRING:
		{
			auto str = CreateStringLiteral (arena, lex->token.string);
			lex->nextToken();
			return str;
		}

		case TOKEN_NUMBER:
		{
			LOG_VERBOSE("Parsing a numberExpression!");
			auto dotPos = lex->token.string.find(".");
			bool isFloat = dotPos == std::string::npos ? false : true;
			if (isFloat) {
				if (lex->token.string.substr(dotPos + 1).find(".") != std::string::npos) {
					// ReportError(worker, worker->token.site, "Floating Point value contains two decimal points!");
				}
				auto value = std::stof(lex->token.string);
				auto result = CreateFloatLiteral(arena, value);
				lex->nextToken();
				return result;
			} else {
				auto value = std::stoi(lex->token.string);
				auto result = CreateIntegerLiteral(arena, value);
				lex->nextToken();
				return result;
			}
		}

		}
		return nullptr;
	};

	std::function<ASTExpression*(MemoryArena*, Lexer*, ASTExpression*, int)> parseBinary
		= [&parsePrimary, &parseBinary](MemoryArena* arena, Lexer* lex, ASTExpression* lhs, int expressionPrec) -> ASTExpression* {
		assert(lhs != nullptr);
		while (true) {

			auto tokenPrec = GetTokenPrecedence(lex->token);
			if (tokenPrec < 0) return lhs;	// Bail if there is no binop

			auto binopToken = lex->token;
			lex->nextToken();

			// We have a binop lets see what is on the other side!
			ASTExpression* rhs = parsePrimary(arena, lex);
			if (rhs == nullptr) {
				//ReportError(worker, binopToken.site, "Could not parse primary expression to the right of binary opperator '" + binopToken.string	+ "'");
				return nullptr;
			}

			auto nextPrec = GetTokenPrecedence (lex->token);
			if (tokenPrec < nextPrec) {
				rhs = parseBinary(arena, lex, rhs, tokenPrec + 1);
				if (rhs == nullptr) {
					LOG_ERROR("Could not parse recursive rhsParsing!");
					return nullptr;
				}
			}

			lhs = (ASTExpression*)CreateBinaryOperation(arena, TokenToOperation(binopToken), lhs, rhs);
		}	 // Goes back to the while loop
	};


	auto lhs = parsePrimary(arena, lex);
	if (lhs == nullptr) return nullptr;
	return parseBinary(arena, lex, lhs, 0);
}