private AST figureOutStatementType()
{
AST statementTree = null;
if (lookAheadType(1) == Token.TokenType.NAME &&
lookAheadType(2) == Token.TokenType.NAME) {
throw new Error("Can't understand what the word '" + lookAhead(1).getTokenString() + "' means here", Error.ErrorType.SYNTAX, lookAhead(1).LineNr, lookAhead(1).LinePosition);
}
else if ( lookAheadType(1) == Token.TokenType.BUILT_IN_TYPE_NAME &&
lookAheadType(2) == Token.TokenType.NAME &&
lookAheadType(3) == Token.TokenType.PARANTHESIS_LEFT )
{
m_functionList.addChild(functionDeclaration());
checkThatItsTheEndOfTheLine();
}
else if (lookAheadType(1) == Token.TokenType.LOOP)
{
statementTree = loop();
}
else if (lookAheadType(1) == Token.TokenType.BUILT_IN_TYPE_NAME &&
lookAheadType(2) == Token.TokenType.NAME)
{
if (lookAheadType(3) == Token.TokenType.ASSIGNMENT) {
statementTree = declarationAndAssignment();
checkThatItsTheEndOfTheLine();
} else {
statementTree = declaration();
checkThatItsTheEndOfTheLine();
}
}
else if (lookAhead(1).getTokenString() == "@" &&
lookAheadType(2) == Token.TokenType.ASSIGNMENT)
{
throw new Error("Can't assign to @", Error.ErrorType.SYNTAX, lookAhead(1).LineNr, lookAhead(1).LinePosition);
}
else if (lookAheadType(1) == Token.TokenType.NAME)
{
if (lookAheadType(2) == Token.TokenType.ASSIGNMENT)
{
statementTree = assignment();
checkThatItsTheEndOfTheLine();
}
else if(lookAheadType(2) == Token.TokenType.OPERATOR &&
(lookAhead(2).getTokenString() == "++" || lookAhead(2).getTokenString() == "--") )
{
statementTree = plusplusOrMinusminus();
}
else if(lookAheadType(2) == Token.TokenType.BRACKET_LEFT)
{
statementTree = assignmentToArray();
}
else if(lookAhead(2).getTokenString() == "+=" || lookAhead(2).getTokenString() == "*=" || lookAhead(2).getTokenString() == "-=" || lookAhead(2).getTokenString() == "/=")
{
statementTree = assignmentAndOperator();
}
else
{
statementTree = expression();
checkThatItsTheEndOfTheLine(); // makes the bodies of if-statements require new line for statements
}
}
else if (lookAheadType(1) == Token.TokenType.NUMBER ||
lookAheadType(1) == Token.TokenType.PARANTHESIS_LEFT)
{
statementTree = expression();
checkThatItsTheEndOfTheLine(); // see above
}
else if (lookAheadType(1) == Token.TokenType.IF)
{
statementTree = ifThenElse();
}
else if (lookAheadType(1) == Token.TokenType.RETURN)
{
statementTree = returnFromFunction();
}
else if (lookAheadType(1) == Token.TokenType.BREAK)
{
statementTree = breakStatement();
}
else if (lookAheadType(1) == Token.TokenType.NEW_LINE)
{
match(Token.TokenType.NEW_LINE); // just skip
}
else
{
throw new Error("Can't understand what the word '" + lookAhead(1).getTokenString() + "' means here",
Error.ErrorType.SYNTAX, lookAhead(1).LineNr, lookAhead(1).LinePosition);
}
return statementTree;
}