Esempio n. 1
0
/*** Parse an input statement ***/
Input* Parser::parseInput()
{
	if(!hasTokens() || peekToken().getType() != T_INPUT)
		throw ParserSyntaxException(getToken(), "Expected \"input\" statement.");
	Token tok = getToken();

	// Check if a getText symbol is present
	bool getText = false;
	if(hasTokens() && peekToken().getType() == T_TEXT)
	{
		getToken();
		getText = true;
	}

	// Remove the colon
	if(!hasTokens() || peekToken().getType() != T_COLON)
		throw ParserSyntaxException(getToken(), "Expected ':'.");

	std::auto_ptr<Input> result(new Input(getText));
	result->setLineNumber(tok.getLineNumber());
	result->setColumnNumber(tok.getColumnNumber());

	do
	{
		getToken();

		// Parse an expression
		result->addExpression(parseExpression());
	}
	while(hasTokens() && peekToken().getType() == T_COMMA);

	return result.release();
}
Esempio n. 2
0
Object* Parser::parseSubExpression2()
{
	bool negateResult = false;
	Token negToken;
	if(hasTokens() && (peekToken().getType() == T_MINUS || peekToken().getType() == T_PLUS))
	{
		if(peekToken().getType() == T_MINUS)
			negateResult = true;
		negToken = getToken();
	}

	std::auto_ptr<Object> result;

	if(hasTokens() && peekToken().getType() == T_HASH)
	{
		Token lengthToken = getToken();
		std::auto_ptr<Object> sub(parseSubExpression1());
		result.reset(new Length(sub.release()));
		result->setLineNumber(lengthToken.getLineNumber());
		result->setColumnNumber(lengthToken.getColumnNumber());
	}

	else
		result.reset(parseSubExpression1());

	if(negateResult)
	{
		result.reset(new Negate(result.release()));
		result->setLineNumber(negToken.getLineNumber());
		result->setColumnNumber(negToken.getColumnNumber());
	}

	return result.release();
}
Esempio n. 3
0
/*** Parse an intern statement ***/
Intern* Parser::parseIntern()
{
	if(!hasTokens() || peekToken().getType() != T_INTERN)
		throw new ParserSyntaxException(getToken(), "Expected \"intern\" command!");
	Token tok = getToken();

	if(!hasTokens() || peekToken().getType() != T_COLON)
		throw new ParserSyntaxException(getToken(), "Expected \":\"!");
	getToken();

	// Loop through, storing variable names
	std::auto_ptr<Intern> result(new Intern());
	result->setLineNumber(tok.getLineNumber());
	result->setColumnNumber(tok.getColumnNumber());

	while(hasTokens() && peekToken().getType() == T_IDENTIFIER)
	{
		result->addIdentifier(getToken().getLexeme());

		if(!hasTokens() || peekToken().getType() != T_COMMA)
			break;
		getToken();
	}

	return result.release();
}
Esempio n. 4
0
/*** Parse an output statement***/
Output* Parser::parseOutput()
{
	if(!hasTokens() || peekToken().getType() != T_OUTPUT)
		throw ParserSyntaxException(getToken(), "Expected \"output\" statement.");
	Token tok = getToken();

	// Check if a no-line-feed symbol is present
	bool lineFeed = true;
	if(hasTokens() && peekToken().getType() == T_NLF)
	{
		getToken();
		lineFeed = false;
	}

	// Remove the colon
	if(!hasTokens() || peekToken().getType() != T_COLON)
		throw ParserSyntaxException(getToken(), "Expected ':'.");

	std::auto_ptr<Output> result(new Output(lineFeed));
	result->setLineNumber(tok.getLineNumber());
	result->setColumnNumber(tok.getColumnNumber());

	do
	{
		getToken();

		// Parse an expression
		result->addExpression(parseExpression());
	}
	while(hasTokens() && peekToken().getType() == T_COMMA);

	return result.release();
}
Esempio n. 5
0
void parseLine(const char **strptr)
{
	if (peekToken(*strptr) == END)
		return;

	char firstCmdName[MAX_CMD_SIZE + 1];
	char temp[MAX_CMD_SIZE + 1];

	Token next = peekToken(*strptr, firstCmdName);

	switch (next) {
	case SETENV:
		parseSetenv(strptr);
		cmdCounter++;
		break;
	case PRINTENV:
		parsePrintenv(strptr);
		cmdCounter++;
		break;
	case EXIT:
		closeUnclosedFd();
		exit(0);
		break;
	case IDENTIFIER:
		parseMultiCmd(strptr);
		if (getPath(temp, firstCmdName))
			cmdCounter++;
		break;
	case END:
		break;
	default:
		PARSE_ASSERT(0);
	}
	PARSE_ASSERT(getToken(NULL, strptr) == END);
}
Esempio n. 6
0
// We are pasting if
//   1. we are preceding a pasting operator within this stream
// or
//   2. the entire macro is preceding a pasting operator (lastTokenPastes)
//      and we are also on the last token
bool TPpContext::TokenStream::peekTokenizedPasting(bool lastTokenPastes)
{
    // 1. preceding ##?

    size_t savePos = currentPos;
    // skip white space
    while (peekToken(' '))
        ++currentPos;
    if (peekToken(PpAtomPaste)) {
        currentPos = savePos;
        return true;
    }

    // 2. last token and we've been told after this there will be a ##

    if (! lastTokenPastes)
        return false;
    // Getting here means the last token will be pasted, after this

    // Are we at the last non-whitespace token?
    savePos = currentPos;
    bool moreTokens = false;
    do {
        if (atEnd())
            break;
        if (!peekToken(' ')) {
            moreTokens = true;
            break;
        }
        ++currentPos;
    } while (true);
    currentPos = savePos;

    return !moreTokens;
}
Esempio n. 7
0
CAssemblerCommand* Parser::parseLabel()
{
	updateFileInfo();

	const Token& start = peekToken(0);

	if (peekToken(0).type == TokenType::Identifier &&
		peekToken(1).type == TokenType::Colon)
	{
		const std::wstring name = peekToken(0).getStringValue();
		eatTokens(2);
		
		if (initializingMacro)
			macroLabels.insert(name);
		
		if (Global.symbolTable.isValidSymbolName(name) == false)
		{
			printError(start,L"Invalid label name");
			return nullptr;
		}

		return new CAssemblerLabel(name);
	}

	return nullptr;
}
Esempio n. 8
0
/*** Parse from zero-level ***/
void Parser::parse()
{
	if(hasTokens() && peekToken().getType() == T_EOL)
		parseSeparation();

	while(hasTokens())
	{
		

	//		if(peekToken().getType() == T_PROC)
	//			parseProcedureDefinition();
	//	else	if(peekToken().getType() == T_FUN)
	//			parseFunctionDefinition();
	//	else
			if(peekToken().getType() == T_PROC)
			{
				parseProcedure();
				parseSeparation();
			}
			else if(peekToken().getType() == T_FUN)
			{
				parseFunction();
				parseSeparation();
			}
			else
			{
			list->pushNode(parseStatement());
			parseSeparation();
			}
	}
//	VariableManager manager;
}
Esempio n. 9
0
/*** Parse a separation ***/
void Parser::parseSeparation()
{
	if(!hasTokens())
		return;

	if(peekToken().getType() != T_SEMICOLON && peekToken().getType() != T_EOL)
		throw ParserSyntaxException(getToken(), "Expected ';' or EOL to separate statements!");

	while(hasTokens() && (peekToken().getType() == T_EOL || peekToken().getType() == T_SEMICOLON))
		getToken();
}
Esempio n. 10
0
/*** Parse an if statement ***/
If* Parser::parseIf()
{
	if(!hasTokens() || peekToken().getType() != T_IF)
		throw ParserSyntaxException(getToken(), "Expected \"if\".");
	Token tok = getToken();

	// Parse the condition
	std::auto_ptr<Object> expr(parseExpression());

	if(!hasTokens() || peekToken().getType() != T_THEN)
		throw ParserSyntaxException(getToken(), "Expected \"then\"!");
	getToken();

	// Parse any newlines
	while(hasTokens() && peekToken().getType() == T_EOL)
		getToken();

	// Parse if statement body
	std::auto_ptr<NodeList> ifStmts(new NodeList());
	while(hasTokens() && !(peekToken().getType() == T_ELSE || peekToken().getType() == T_FI))
	{
		ifStmts->pushNode(parseStatement());
		parseSeparation();
	}

	// Create the new if object
	std::auto_ptr<If> result(new If());
	result->setLineNumber(tok.getLineNumber());
	result->setColumnNumber(tok.getColumnNumber());

	// Parse an else statement body if present
	if(hasTokens() && peekToken().getType() == T_ELSE)
	{
		getToken();
		std::auto_ptr<NodeList> elseStmts(new NodeList());

		// Parse any newlines
		while(hasTokens() && peekToken().getType() == T_EOL)
			getToken();

		while(hasTokens() && peekToken().getType() != T_FI)
		{
			elseStmts->pushNode(parseStatement());
			parseSeparation();
		}

		result->setElseStatements(elseStmts.release());
	}

	if(!hasTokens() || peekToken().getType() != T_FI)
		throw ParserSyntaxException(getToken(), "Expected \"fi\"!");
	getToken();

	result->setIfCondition(expr.release());
	result->setIfStatements(ifStmts.release());
	return result.release();
}
Esempio n. 11
0
/*** Parse a return statement ***/
Return* Parser::parseReturn()
{
	if(!hasTokens() || peekToken().getType() != T_RETURN)
		throw ParserSyntaxException(getToken(), "Expected \"return\" command!");
	Token tok = getToken();

	std::auto_ptr<Return> ret(new Return());
	ret->setLineNumber(tok.getLineNumber());
	ret->setColumnNumber(tok.getColumnNumber());

	if(!hasTokens() || peekToken().getType() == T_EOL)
		return ret.release();
	std::auto_ptr<Object> expr(parseExpression());
	ret->setExpression(expr.release());
	return ret.release();
}
Esempio n. 12
0
bool Parser::parseExpressionList(std::vector<Expression>& list, int min, int max)
{
	bool valid = true;
	list.clear();
	list.reserve(max >= 0 ? max : 32);

	const Token& start = peekToken();

	Expression exp = parseExpression();
	list.push_back(exp);

	if (exp.isLoaded() == false)
	{
		printError(start,L"Parameter failure");
		getTokenizer()->skipLookahead();
		valid = false;
	}

	while (peekToken().type == TokenType::Comma)
	{
		eatToken();

		exp = parseExpression();
		list.push_back(exp);

		if (exp.isLoaded() == false)
		{
			printError(start,L"Parameter failure");
			getTokenizer()->skipLookahead();
			valid = false;
		}
	}

	if (list.size() < (size_t) min)
	{
		printError(start,L"Not enough parameters (min %d)",min);
		return false;
	}

	if (max != -1 && (size_t) max < list.size())
	{
		printError(start,L"Too many parameters (max %d)",max);
		return false;
	}

	return valid;
}
Esempio n. 13
0
StringMath::Token StringMath::Lexer::popToken() {
    const Token token = peekToken();

    if(tokens.size() > 0)
        tokens.pop_front();

    return token;
}
Esempio n. 14
0
    bool getToken(TokenId token, CurrPtr& curr, EndPtr end)
    {
        if (peekToken(curr, end) != token)
            return false;

        getToken(curr, end);
        return true;
    }
Esempio n. 15
0
    /**
     * Parse a key element.
     * @param name Name of the parsed key element.
     */
    KeyElement *parseKeyElement(String const &name)
    {
        InfoValue value;

        if(peekToken() == "$")
        {
            // This is a script value.
            value.flags |= InfoValue::Script;
            nextToken();
        }

        // A colon means that that the rest of the line is the value of
        // the key element.
        if(peekToken() == ":")
        {
            value.text = readToEOL().trimmed();
            nextToken();
        }
        else if(peekToken() == "=")
        {
            if(value.flags.testFlag(InfoValue::Script))
            {
                // Parse one script statement.
                value = parseScript(1);
                value.text = value.text.trimmed();
            }
            else
            {
                /**
                 * Key =
                 *   "This is a long string "
                 *   "that spans multiple lines."
                 */
                nextToken();
                value.text = parseValue();
            }
        }
        else
        {
            throw SyntaxError("Info::parseKeyElement",
                              QString("Expected either '=' or ':', but '%1' found instead (on line %2).")
                              .arg(peekToken()).arg(currentLine));
        }
        return new KeyElement(name, value);
    }
Esempio n. 16
0
Object* Parser::parseValue()
{
	if(!hasTokens())
		return 0;

	if(peekToken().getType() == T_EMPTY)
	{
		Object* obj = new Object();
		Token tok = getToken();
		obj->setLineNumber(tok.getLineNumber());
		obj->setColumnNumber(tok.getColumnNumber());
		return obj;
	}

	if(peekToken().getType() == T_UNSIGNEDINT)
		return new Integer(getToken());

	if(peekToken().getType() == T_UNSIGNEDREAL)
		return new Real(getToken());

	if(peekToken().getType() == T_YES || peekToken().getType() == T_NO)
		return new Logical(getToken());

	if(peekToken().getType() == T_STRING)
		return new Text(getToken());

	if(peekToken().getType() == T_IDENTIFIER)
		return new Variable(getToken());

	return 0;
}
Esempio n. 17
0
/*** Parse an assign statement ***/
Assign* Parser::parseAssign()
{
	if(!hasTokens() || peekToken().getType() != T_IDENTIFIER)
		throw ParserSyntaxException(getToken(), "Expected variable identifier!");

	std::auto_ptr<Variable> target(new Variable(getToken().getLexeme()));

	if(!hasTokens() || peekToken().getType() != T_ASSIGN)
		throw ParserSyntaxException(getToken(), "Expected ':='!");
	Token tok = getToken();

	std::auto_ptr<Object> expr(parseExpression());

	Assign* as = new Assign(target.release(), expr.release());
	as->setLineNumber(tok.getLineNumber());
	as->setColumnNumber(tok.getColumnNumber());
	return as;
}
Esempio n. 18
0
bool KAbstractObjParserPrivate::parseIndex(index_type &i)
{
  if (peekToken().m_token == PT_INTEGER)
  {
    i = static_cast<uint64_t>(nextToken().m_attribute.asInteger);
    return true;
  }
  return false;
}
Esempio n. 19
0
Object* Parser::parseSubExpression7()
{
	std::auto_ptr<Object> expr1(parseSubExpression6());

	while(hasTokens() && (peekToken().getType() == T_SLASHEQ || peekToken().getType() == T_EQUAL))
	{
		Token tok = getToken();
		std::auto_ptr<Object> expr2(parseSubExpression6());
		if(tok.getType() == T_SLASHEQ)
			expr1.reset(new Unequal(expr1.release(), expr2.release()));
		else
			expr1.reset(new Equal(expr1.release(), expr2.release()));
		expr1->setLineNumber(tok.getLineNumber());
		expr1->setColumnNumber(tok.getColumnNumber());
	}

	return expr1.release();
}
Esempio n. 20
0
CAssemblerCommand* Parser::handleError()
{
	// skip the rest of the line
	const Token& token = nextToken();
	while (peekToken().line == token.line)
		eatToken();

	clearError();
	return new InvalidCommand();
}
Esempio n. 21
0
Object* Parser::parseSubExpression5()
{
	std::auto_ptr<Object> expr1(parseSubExpression4());

	while(hasTokens() && (peekToken().getType() == T_PLUS || peekToken().getType() == T_MINUS))
	{
		Token tok = getToken();
		unsigned char operation = tok.getType();
		std::auto_ptr<Object> expr2(parseSubExpression4());
		if(operation == T_PLUS)
			expr1.reset(new Add(expr1.release(), expr2.release()));
		else
			expr1.reset(new Subtract(expr1.release(), expr2.release()));
		expr1->setLineNumber(tok.getLineNumber());
		expr1->setColumnNumber(tok.getColumnNumber());
	}

	return expr1.release();
}
Esempio n. 22
0
/*** Parse an end statement ***/
End* Parser::parseEnd()
{
	if(!hasTokens() || peekToken().getType() != T_END)
		throw ParserSyntaxException(getToken(), "Expected \"end\" command!");
	Token tok = getToken();

	End* en = new End();
	en->setLineNumber(tok.getLineNumber());
	en->setColumnNumber(tok.getColumnNumber());
	return en;
}
Esempio n. 23
0
/*** Parse an exit statement ***/
Exit* Parser::parseExit()
{
	if(!hasTokens() || peekToken().getType() != T_EXIT)
		ParserSyntaxException(getToken(), "Expected \"exit\" command!");
	Token tok = getToken();

	Exit* ex = new Exit();
	ex->setLineNumber(tok.getLineNumber());
	ex->setColumnNumber(tok.getColumnNumber());
	return ex;
}
Esempio n. 24
0
// See if the next non-white-space tokens are two consecutive #
bool TPpContext::TokenStream::peekUntokenizedPasting()
{
    // don't return early, have to restore this
    size_t savePos = currentPos;

    // skip white-space
    while (peekToken(' '))
        ++currentPos;

    // check for ##
    bool pasting = false;
    if (peekToken('#')) {
        ++currentPos;
        if (peekToken('#'))
            pasting = true;
    }

    currentPos = savePos;

    return pasting;
}
Esempio n. 25
0
bool Parser::matchToken(TokenType type, bool optional)
{
	if (optional)
	{
		const Token& token = peekToken();
		if (token.type == type)
			eatToken();
		return true;
	}
	
	return nextToken().type == type;
}
Esempio n. 26
0
    /**
     * Parse a list element, identified by the given name.
     */
    ListElement *parseListElement(String const &name)
    {
        if(peekToken() != "<")
        {
            throw SyntaxError("Info::parseListElement",
                              QString("List must begin with a '<', but '%1' found instead (on line %2).")
                              .arg(peekToken()).arg(currentLine));
        }

        QScopedPointer<ListElement> element(new ListElement(name));

        /// List syntax:
        /// list ::= list-identifier '<' [value {',' value}] '>'
        /// list-identifier ::= token

        // Move past the opening angle bracket.
        nextToken();

        forever
        {
            element->add(parseValue());

            // List elements are separated explicitly.
            String separator = peekToken();
            nextToken();

            // The closing bracket?
            if(separator == ">") break;

            // There should be a comma here.
            if(separator != ",")
            {
                throw SyntaxError("Info::parseListElement",
                                  QString("List values must be separated with a comma, but '%1' found instead (on line %2).")
                                  .arg(separator).arg(currentLine));
            }
        }
        return element.take();
    }
Esempio n. 27
0
Object* Parser::parseSubExpression6()
{
	std::auto_ptr<Object> expr1(parseSubExpression5());

	while(hasTokens() && (peekToken().getType() == T_LESS || peekToken().getType() == T_GREAT || peekToken().getType() == T_LESSEQ || peekToken().getType() == T_GREATEQ))
	{
		Token tok = getToken();
		unsigned char operation = tok.getType();
		std::auto_ptr<Object> expr2(parseSubExpression5());
		if(operation == T_LESS)
			expr1.reset(new Less(expr1.release(), expr2.release()));
		else if(operation == T_GREAT)
			expr1.reset(new Greater(expr1.release(), expr2.release()));
		else if(operation == T_LESSEQ)
			expr1.reset(new LessEq(expr1.release(), expr2.release()));
		else
			expr1.reset(new GreatEq(expr1.release(), expr2.release()));
		expr1->setLineNumber(tok.getLineNumber());
		expr1->setColumnNumber(tok.getColumnNumber());
	}

	return expr1.release();
}
Esempio n. 28
0
Object* Parser::parseSubExpression4()
{
	std::auto_ptr<Object> expr1(parseSubExpression3());

	while(hasTokens() && (peekToken().getType() == T_MULTIPLY || peekToken().getType() == T_DIVIDE || peekToken().getType() == T_INTDIVIDE || peekToken().getType() == T_REMAINDER))
	{
		Token tok = getToken();
		unsigned char operation = tok.getType();
		std::auto_ptr<Object> expr2(parseSubExpression3());
		if(operation == T_MULTIPLY)
			expr1.reset(new Multiply(expr1.release(), expr2.release()));
		else if(operation == T_DIVIDE)
			expr1.reset(new Divide(expr1.release(), expr2.release()));
		else if(operation == T_INTDIVIDE)
			expr1.reset(new IntDivide(expr1.release(), expr2.release()));
		else
			expr1.reset(new Remainder(expr1.release(), expr2.release()));
		expr1->setLineNumber(tok.getLineNumber());
		expr1->setColumnNumber(tok.getColumnNumber());
	}

	return expr1.release();
}
Esempio n. 29
0
bool KAbstractObjParserPrivate::parseFloat(float &f)
{
  switch (peekToken().m_token)
  {
  case PT_FLOAT:
    f = nextToken().m_attribute.asFloat;
    break;
  case PT_INTEGER:
    f = static_cast<float>(nextToken().m_attribute.asInteger);
    break;
  default:
    return false;
  }
  return true;
}
Esempio n. 30
0
void parseMultiCmd(const char **strptr)
{
	parseCmd(strptr);
	
	Token nextToken = peekToken(*strptr);
	switch (nextToken) {
	case IDENTIFIER:
		parseMultiCmd(strptr);
		break;
	case END:
		break;
	default:
		PARSE_ASSERT(0);
	}
}