Skip to content

Commit 8526a08

Browse files
committed
SIFOSC、配列の値の参照時に無限再帰を起こさない様に修正。
1 parent d9f5714 commit 8526a08

File tree

1 file changed

+41
-30
lines changed

1 file changed

+41
-30
lines changed

FastChatProtocolInterface/SimpleFormulaScript/SifoscParser.cs

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public static bool TryParseMulDivExpression(this SourceCode sc, [NotNullWhen(tru
135135
ref var left = ref result;
136136
char op = '\0';
137137

138-
while (sc.TryParseValueExpression(out var right)) {
138+
while (sc.TryParseGetExpression(out var right)) {
139139
switch (op) {
140140
case '\0' when left is null:
141141
left = right;
@@ -173,12 +173,51 @@ public static bool TryParseMulDivExpression(this SourceCode sc, [NotNullWhen(tru
173173
}
174174
}
175175

176+
public static bool TryParseGetExpression(this SourceCode sc, [NotNullWhen(true)][MaybeNullWhen(false)] out SifoscObject? result)
177+
{
178+
sc.BeginScope();
179+
180+
result = null;
181+
ref var left = ref result;
182+
char op = '\0';
183+
184+
while (sc.TryParseValueExpression(out var right)) {
185+
switch (op) {
186+
case '\0' when left is null:
187+
left = right;
188+
break;
189+
case '.':
190+
left = left?.Get(right);
191+
break;
192+
default:
193+
left = null;
194+
goto end;
195+
}
196+
197+
sc.SkipSpaces();
198+
if (!sc.TryReadChar(out op) || op is not '.') {
199+
if (op != '\0') {
200+
sc.Retreat();
201+
}
202+
break;
203+
}
204+
}
205+
206+
end:
207+
if (result is null) {
208+
sc.EndScope(true);
209+
return false;
210+
} else {
211+
sc.EndScope(false);
212+
return true;
213+
}
214+
}
215+
176216
public static bool TryParseValueExpression(this SourceCode sc, [NotNullWhen(true)][MaybeNullWhen(false)] out SifoscObject? result)
177217
{
178218
sc.SkipSpaces();
179219

180220
return sc.TryParseParenthesisExpression(out result)
181-
|| sc.TryParseGetExpression (out result)
182221
|| sc.TryParseSignExpression (out result)
183222
|| sc.TryParseNotExpression (out result)
184223
|| sc.TryParseValueLiteral (out result);
@@ -201,34 +240,6 @@ public static bool TryParseParenthesisExpression(this SourceCode sc, [NotNullWhe
201240
return false;
202241
}
203242

204-
public static bool TryParseGetExpression(this SourceCode sc, [NotNullWhen(true)][MaybeNullWhen(false)] out SifoscObject? result)
205-
{
206-
sc.BeginScope();
207-
208-
if (sc.TryParseValueExpression(out var left)) {
209-
sc.SkipSpaces();
210-
if (sc.AdvanceIf('.') && sc.TryParseValueExpression(out var right)) {
211-
result = left.Get(right);
212-
213-
if (result is null) {
214-
goto fail;
215-
} else {
216-
goto succeed;
217-
}
218-
}
219-
}
220-
221-
result = null;
222-
223-
fail:
224-
sc.EndScope(true);
225-
return false;
226-
227-
succeed:
228-
sc.EndScope(false);
229-
return true;
230-
}
231-
232243
public static bool TryParseSignExpression(this SourceCode sc, [NotNullWhen(true)][MaybeNullWhen(false)] out SifoscObject? result)
233244
{
234245
sc.BeginScope();

0 commit comments

Comments
 (0)