private void ProcessKeyword(KeywordToken keywordToken)
{
PredefinedSymbol keyword = keywordToken.SymbolType;
if (keyword == PredefinedSymbol.If)
{
_source.ExpectKeyword(PredefinedSymbol.OpenParenthesis);
Expression condition = ReadExpression(true, PredefinedSymbol.CloseParenthesis);
GenerateCodeForExpression(condition);
ProcessCodeBlock();
if (_source.NextIsKeyword(PredefinedSymbol.Else))
{
ProcessCodeBlock();
}
}
else if (keyword == PredefinedSymbol.While)
{
_source.ExpectKeyword(PredefinedSymbol.OpenParenthesis);
Expression condition = ReadExpression(true, PredefinedSymbol.CloseParenthesis);
GenerateCodeForExpression(condition);
ProcessCodeBlock();
}
else if (keyword == PredefinedSymbol.For)
{
// TODO: Handle for loops
}
else if (keyword == PredefinedSymbol.Break)
{
// TODO: Handle break
}
else if (keyword == PredefinedSymbol.Continue)
{
// TODO: Handle continue
}
else if (keyword == PredefinedSymbol.Return)
{
Expression resultToReturn = ReadExpression(true, PredefinedSymbol.Semicolon);
GenerateCodeForExpression(resultToReturn);
// TODO: Generate code to return and release local vars
FreeAllLocalVariablesButLeaveValid();
}
else
{
throw new CompilerMessage(ErrorCode.InvalidUseOfKeyword, "Keyword '" + keywordToken.Name + "' is not valid here");
}
}