private int ParseExpressionPriority(idScriptParser parser, int priority, idWindowVariable var = null, int component = 0)
{
if(priority == 0)
{
return ParseTerm(parser, var, component);
}
idToken token;
string tokenValue;
int a = ParseExpressionPriority(parser, priority - 1, var, component);
if((token = parser.ReadToken()) == null)
{
// we won't get EOF in a real file, but we can when parsing from generated strings
return a;
}
tokenValue = token.ToString();
if(priority == 1)
{
if(tokenValue == "*")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Multiply, priority);
}
else if(tokenValue == "/")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Divide, priority);
}
else if(tokenValue == "%")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Modulo, priority);
}
}
else if(priority == 2)
{
if(tokenValue == "+")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Add, priority);
}
else if(tokenValue == "-")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Subtract, priority);
}
}
else if(priority == 3)
{
if(tokenValue == ">")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.GreaterThan, priority);
}
else if(tokenValue == ">=")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.GreaterThanOrEqual, priority);
}
else if(tokenValue == "<")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.LessThan, priority);
}
else if(tokenValue == "<=")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.LessThanOrEqual, priority);
}
else if(tokenValue == "==")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Equal, priority);
}
else if(tokenValue == "!=")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.NotEqual, priority);
}
}
else if(priority == 4)
{
if(tokenValue == "&&")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.And, priority);
}
else if(tokenValue == "||")
{
return ParseEmitOperation(parser, a, WindowExpressionOperationType.Or, priority);
}
else if(tokenValue == "?")
{
WindowExpressionOperation op;
int o = ParseEmitOperation(parser, a, WindowExpressionOperationType.Conditional, priority, out op);
if((token = parser.ReadToken()) == null)
{
return o;
}
else if(token.ToString() == ":")
{
a = ParseExpressionPriority(parser, priority - 1, var);
op.D = a;
}
return priority;
}
}
// assume that anything else terminates the expression
// not too robust error checking...
parser.UnreadToken(token);
return a;
}