ZScript parser: added support for min and max value constants in the states block. Fixes #1019

This commit is contained in:
biwa 2024-05-09 20:01:09 +02:00
parent 071818dc2d
commit 456ae573ed

View file

@ -59,6 +59,7 @@ namespace CodeImp.DoomBuilder.ZDoom
// todo: parse stuff
//
string[] control_keywords = new string[] { "goto", "loop", "wait", "fail", "stop" };
string[] data_types = new string[] { "double", "int", "uint" };
while (true)
{
@ -151,20 +152,54 @@ namespace CodeImp.DoomBuilder.ZDoom
token = tokenizer.ExpectToken(ZScriptTokenType.Identifier);
if (token != null && token.IsValid)
{
duration = -1;
tokenizer.SkipWhitespace();
token = tokenizer.ExpectToken(ZScriptTokenType.OpenParen);
if (token != null && token.IsValid)
{
List<ZScriptToken> tokens = parser.ParseExpression(true);
tokenizer.SkipWhitespace();
token = tokenizer.ExpectToken(ZScriptTokenType.CloseParen);
if (token == null || !token.IsValid)
{
parser.ReportError("Expected ), got " + ((Object)token ?? "<null>").ToString());
return;
}
}
// Known data type? Then it's hopefully the .min or .max value (like int.min or int.max)
if (data_types.Contains(token.Value))
{
token = tokenizer.ExpectToken(ZScriptTokenType.Dot);
if(token == null || !token.IsValid)
{
parser.ReportError("Expected ., got " + ((Object)token ?? "<null>").ToString());
return;
}
token = tokenizer.ExpectToken(ZScriptTokenType.Identifier);
if (token == null || !token.IsValid)
{
parser.ReportError("Expected an identifier, got " + ((Object)token ?? "<null>").ToString());
return;
}
if (token.Value == "min")
{
duration = int.MinValue;
}
else if (token.Value == "max")
{
duration = int.MaxValue;
}
else
{
parser.ReportError("Expected min or max, got " + ((Object)token ?? "<null>").ToString());
return;
}
}
else // No known data type
{
duration = -1;
tokenizer.SkipWhitespace();
token = tokenizer.ExpectToken(ZScriptTokenType.OpenParen);
if (token != null && token.IsValid)
{
List<ZScriptToken> tokens = parser.ParseExpression(true);
tokenizer.SkipWhitespace();
token = tokenizer.ExpectToken(ZScriptTokenType.CloseParen);
if (token == null || !token.IsValid)
{
parser.ReportError("Expected ), got " + ((Object)token ?? "<null>").ToString());
return;
}
}
}
}
else
{