/// <summary>
///
/// </summary>
/// <param name="lexer"></param>
/// <returns>A register index.</returns>
private int ParseTerm(idLexer lexer)
{
idToken token = lexer.ReadToken();
string tokenValue = token.ToString();
string tokenLower = tokenValue.ToLower();
if(tokenValue == "(")
{
int a = ParseExpression(lexer);
MatchToken(lexer, ")");
return a;
}
ExpressionRegister tmpReg;
if(Enum.TryParse<ExpressionRegister>(tokenValue, true, out tmpReg) == true)
{
_parsingData.RegistersAreConstant = false;
return (int) tmpReg;
}
if(tokenLower == "fragmentPrograms")
{
return GetExpressionConstant(1.0f);
}
else if(tokenLower == "sound")
{
_parsingData.RegistersAreConstant = false;
return EmitOp(0, 0, ExpressionOperationType.Sound);
}
// parse negative numbers
else if(tokenLower == "-")
{
token = lexer.ReadToken();
if((token.Type == TokenType.Number) || (token.ToString() == "."))
{
return GetExpressionConstant(-token.ToFloat());
}
lexer.Warning("Bad negative number '{0}'", token.ToString());
this.MaterialFlag = MaterialFlags.Defaulted;
return 0;
}
else if((token.Type == TokenType.Number) || (tokenValue == ".") || (tokenValue == "-"))
{
return GetExpressionConstant(token.ToFloat());
}
// see if it is a table name
idDeclTable table = idE.DeclManager.FindType<idDeclTable>(DeclType.Table, tokenValue, false);
if(table == null)
{
lexer.Warning("Bad term '{0}'", tokenValue);
this.MaterialFlag = MaterialFlags.Defaulted;
return 0;
}
// parse a table expression
MatchToken(lexer, "[");
int b = ParseExpression(lexer);
MatchToken(lexer, "]");
return EmitOp(table.Index, b, ExpressionOperationType.Table);
}