Exemple #1
0
NodePointer Parser::returnStatement()
{
	getNextSymbol();
	NodePointer expressionTree;
	if (currentSymbol_.symbolType_ != SEMICOLON)
	{
		expressionTree = expression();
	}
	accept(SEMICOLON);
	NodePointer returnStatement(new ReturnStatement(tables_.subroutineStack_, expressionTree, getLineNumber()));
	return returnStatement;
}
Exemple #2
0
NodePointer Parser::statement()
{
	NodePointer result;

	switch (currentSymbol_.symbolType_)
	{
		case IF:
			return ifStatement();

		case WHILE:
			return whileStatement();

		case IDENTIFIER:
		case GLOBAL:
		case ARGUMENT:
		case CALL:
		case CONSTANT:
			result = expression();
			accept(SEMICOLON);
			return result;

		case MY:
			return localVariable();

		case PRINT:
			return printStatement();

		case SUBROUTINE:
			return procedureDefinition();

		case RETURN:
			return returnStatement();

		case LEFT_BRACE:
			return blockStatement();

		default:
			throw ErrorMessage("Unexpected symbol " + symbolToString(currentSymbol_), getLineNumber());
	}
}
Exemple #3
0
AST* Parser::statement(Scope* ps)
{
    AST* ret = NULL;

    if (expect(";"))
    {
        ret = emptyStatement();
    }
    else if (expect("var"))
    {
        ret = varStatement(ps);
        opteol();
    }
    else if (expect("{"))
    {
        ret = block(ps);
        opteol();
    }
    else if (expect("if"))
    {
        ret = ifStatement(ps);
    }
    else if (expect("switch"))
    {
        ret = switchStatement(ps);
    }
    else if (expect("do"))
    {
        ret = doStatement(ps);
        opteol();
    }
    else if (expect("while"))
    {
        ret = whileStatement(ps);
    }
    else if (expect("for"))
    {
        ret = forStatement(ps);
    }
    else if (expect("with"))
    {
        ret = withStatement(ps);
    }
    else if (expect("continue"))
    {
        ret = continueStatement();
        opteol();
    }
    else if (expect("break"))
    {
        ret = breakStatement();
        opteol();
    }
    else if (expect("return"))
    {
        ret = returnStatement(ps);
        opteol();
    }
    else if (expect("try"))
    {
        ret = tryStatement(ps);
    }
    else if (expect("throw"))
    {
        ret = throwStatement(ps);
        opteol();
    }
    else
    {
        ret = expression(0, ps);
        opteol();
    }

    return ret;
}