Esempio n. 1
0
void Parser::parseFactor_p(IdentifierPtr id)
{
    if (m_curToken.tokenType() == TokenType::LBracket) {
        id->index = parseOptionalIndex();
        return;
    } else if (match(TokenType::LParen)) {
        id->parameters = parseExpressionList();
        if (m_errorCode > ErrorCodes::NoError) {
            panic(factorFollow, factorFollowSize);
            return;
        }

        if (!match(TokenType::RParen)) {
            reportError(ErrorCodes::ExpectedRParen);

            panic(factorFollow, factorFollowSize);
            return;
        }

        if (!id->parameters) {
            // empty param list
            ExpressionsPtr tmp(new Expressions);
            id->parameters = tmp;
        }

        return;
    }

    // is empty
}
Esempio n. 2
0
ExpressionsPtr Parser::parseExpressionList_r()
{
    if (match(TokenType::Comma)) {
        return parseExpressionList();
    }

    return ExpressionsPtr();
}
Esempio n. 3
0
void Parser::parseProcedureStatementPrime(SymbolTableEntry* prevEntry){
	if(isNext(tc_LPAREN)){
		match(tc_LPAREN);
		parseExpressionList(prevEntry);
		match(tc_RPAREN);
		if(m_parserError){
			TokenCode synch[] = {tc_END, tc_SEMICOL, tc_ELSE, tc_NONE};
			recover(synch);
//			if(isNext(tc_RPAREN)){
//				match(tc_RPAREN);
//			}
		}
	}
}
Esempio n. 4
0
SymbolTableEntry* Parser::parseFactorPrime(SymbolTableEntry* prevEntry){
	if(isNext(tc_LBRACKET)){
		parseVariablePrime(prevEntry);
	}
	else if(isNext(tc_LPAREN)){
		match(tc_LPAREN);
		parseExpressionList(prevEntry);
		match(tc_RPAREN);
		if(m_parserError){
			TokenCode synch[] = {tc_RPAREN, tc_END, tc_ADDOP, tc_MULOP, tc_RELOP, tc_THEN, tc_DO, tc_COMMA, tc_RBRACKET, tc_SEMICOL, tc_ELSE, tc_NONE};
			recover(synch);
//			if(isNext(tc_RPAREN)){
//				match(tc_RPAREN);
//			}
		}
		//m_code->generate(cd_CALL, prevEntry, NULL, NULL);
	}
	return prevEntry;
}
Esempio n. 5
0
ExpressionsPtr Parser::parseOptionalParameters()
{
    if (match(TokenType::LParen)) {
        ExpressionsPtr parameters = parseExpressionList();
        if (m_errorCode > ErrorCodes::NoError) {
            return ExpressionsPtr();
        }

        if (!match(TokenType::RParen)) {
            reportError(ErrorCodes::ExpectedRParen);
            return ExpressionsPtr();
        }

        if (!parameters) {
            // empty parameter list
            ExpressionsPtr tmp(new Expressions);
            parameters = tmp;
        }

        return parameters;
    }

    return ExpressionsPtr();
}
Esempio n. 6
0
bool Parser::checkMacroDefinition()
{
	const Token& first = peekToken();
	if (first.type != TokenType::Identifier)
		return false;

	if (!first.stringValueStartsWith(L'.') || first.getStringValue() != L".macro")
		return false;

	eatToken();

	// nested macro definitions are not allowed
	if (initializingMacro)
	{
		printError(first,L"Nested macro definitions not allowed");
		while (!atEnd())
		{
			const Token& token = nextToken();
			if (token.type == TokenType::Identifier && token.getStringValue() == L".endmacro")
				break;
		}

		return true;
	}

	std::vector<Expression> parameters;
	if (parseExpressionList(parameters,1,-1) == false)
		return false;
	
	// load name
	std::wstring macroName;
	if (parameters[0].evaluateIdentifier(macroName) == false)
		return false;

	// duplicate check the macro
	ParserMacro &macro = macros[macroName];
	if (macro.name.length() != 0)
	{
		printError(first,L"Macro \"%s\" already defined",macro.name);
		return false;
	}

	// and register it
	macro.name = macroName;
	macro.counter = 0;

	// load parameters
	for (size_t i = 1; i < parameters.size(); i++)
	{
		std::wstring name;
		if (parameters[i].evaluateIdentifier(name) == false)
			return false;

		macro.parameters.push_back(name);
	}

	// load macro content

	TokenizerPosition start = getTokenizer()->getPosition();
	bool valid = false;
	while (atEnd() == false)
	{
		const Token& tok = nextToken();
		if (tok.type == TokenType::Identifier && tok.getStringValue() == L".endmacro")
		{
			valid = true;
			break;
		}
	}
	
	// no .endmacro, not valid
	if (valid == false)
		return true;

	// get content
	TokenizerPosition end = getTokenizer()->getPosition().previous();
	macro.content = getTokenizer()->getTokens(start,end);

	return true;
}
Esempio n. 7
0
StringMath::Token StringMath::evaluate(const std::string &expressionList) {
    lexer.reset(expressionList);
    return parseExpressionList();
}