Add 'ParseReturnValuesOnly' to the lua prototype parser.

This commit is contained in:
2026-03-04 17:50:18 -05:00
parent 4dabb98d05
commit 78f0f318c5
4 changed files with 64 additions and 31 deletions

View File

@@ -91,10 +91,7 @@ void FlxParsedProto::Syntax() {
ErrorMessage = Message;
}
void FlxParsedProto::Parse(const FString &str) {
Empty();
// Step one: tokenize.
bool FlxParsedProto::Tokenize(const FString &str) {
int offset = 0;
while (offset < str.Len()) {
TCHAR c = str[offset];
@@ -113,12 +110,33 @@ void FlxParsedProto::Parse(const FString &str) {
} else {
Empty();
ErrorMessage = FString::Printf(TEXT("%s ? %s"), *str.Mid(0, offset), *str.Mid(offset));
return;
return false;
}
}
NextToken = 0;
return true;
}
// Step two: Parse.
void FlxParsedProto::ParseReturnValues() {
while (true) {
if (IsLiteral(TEXT("..."))) {
ExtraReturnValues = true;
NextToken++;
break;
} else if (IsIdent()) {
FString Type = Tokens[NextToken++];
if (!IsIdent()) return Syntax();
FString Name = Tokens[NextToken++];
ReturnValues.Add(Pin(Type, Name));
if (!IsLiteral(TEXT(","))) break;
NextToken++;
} else {
return Syntax();
}
}
}
void FlxParsedProto::Parse() {
if (!IsLiteral(TEXT("*")) && !IsIdent()) return Syntax();
ClassName = Tokens[NextToken++];
if (!IsLiteral(TEXT("."))) return Syntax();
@@ -142,24 +160,24 @@ void FlxParsedProto::Parse(const FString &str) {
NextToken++;
if (IsLiteral(TEXT(":"))) {
NextToken++;
while (true) {
if (IsLiteral(TEXT("..."))) {
ExtraReturnValues = true;
NextToken++;
break;
} else if (IsIdent()) {
FString Type = Tokens[NextToken++];
if (!IsIdent()) return Syntax();
FString Name = Tokens[NextToken++];
ReturnValues.Add(Pin(Type, Name));
if (!IsLiteral(TEXT(","))) break;
NextToken++;
} else {
return Syntax();
}
}
ParseReturnValues();
}
if (NextToken != Tokens.Num()) return Syntax();
}
FlxParsedProto FlxParsedProto::ParsePrototype(const FString &str) {
FlxParsedProto Result;
if (!Result.Tokenize(str)) return Result;
Result.Parse();
if (Result.NextToken != Result.Tokens.Num()) Result.Syntax();
return Result;
}
FlxParsedProto FlxParsedProto::ParseReturnValuesOnly(const FString &str) {
FlxParsedProto Result;
if (!Result.Tokenize(str)) return Result;
Result.ParseReturnValues();
if (Result.NextToken != Result.Tokens.Num()) Result.Syntax();
return Result;
}
/////////////////////////////////////////////////////////////////