Skip to content

Commit 9fe5c1d

Browse files
committed
fix: replace Scanner with Matcher for token processing in ExpressionParser
1 parent 94c19a5 commit 9fe5c1d

File tree

1 file changed

+27
-33
lines changed

1 file changed

+27
-33
lines changed

src/java/mindustrytool/workflow/expressions/ExpressionParser.java

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import java.util.List;
88
import java.util.Map;
99
import java.util.Queue;
10-
import java.util.Scanner;
1110
import java.util.Deque;
1211
import java.util.function.BiFunction;
1312
import java.util.function.Function;
13+
import java.util.regex.Matcher;
1414
import java.util.regex.Pattern;
1515

1616
import arc.util.Log;
@@ -110,39 +110,33 @@ private Queue<String> toExpressionQueue(String expr, Map<String, Object> variabl
110110
Deque<String> ops = new ArrayDeque<>();
111111
Queue<String> output = new LinkedList<>();
112112

113-
try (Scanner scanner = new Scanner(expr.trim()).useDelimiter(TOKEN_PATTERN)) {
114-
while (scanner.hasNext()) {
115-
if (scanner.hasNextDouble()) {
116-
var value = scanner.next();
117-
output.add(value);
118-
Log.debug("Push number: " + value);
119-
} else {
120-
String token = scanner.next();
121-
122-
if (UNARY_OPERATORS.containsKey(token)) {
123-
ops.push(token);
124-
Log.debug("Push unary operator: " + token);
125-
} else if (BINARY_OPERATORS.containsKey(token)) {
126-
while (!ops.isEmpty() && PRECEDENCE.getOrDefault(ops.peek(), 0) >= PRECEDENCE.get(token)) {
127-
output.add(ops.pop());
128-
}
129-
ops.push(token);
130-
Log.debug("Push binary operator: " + token);
131-
} else if ("(".equals(token)) {
132-
ops.push(token);
133-
} else if (")".equals(token)) {
134-
while (!"(".equals(ops.peek())) {
135-
output.add(ops.pop());
136-
}
137-
ops.pop();
138-
if (!ops.isEmpty() && UNARY_OPERATORS.containsKey(ops.peek())) {
139-
output.add(ops.pop());
140-
}
141-
} else {
142-
Log.debug("Push token: " + token);
143-
output.add(token);
144-
}
113+
Matcher matcher = TOKEN_PATTERN.matcher(expr);
114+
115+
while (matcher.find()) {
116+
String token = matcher.group().trim();
117+
118+
if (UNARY_OPERATORS.containsKey(token)) {
119+
ops.push(token);
120+
Log.debug("Push unary operator: " + token);
121+
} else if (BINARY_OPERATORS.containsKey(token)) {
122+
while (!ops.isEmpty() && PRECEDENCE.getOrDefault(ops.peek(), 0) >= PRECEDENCE.get(token)) {
123+
output.add(ops.pop());
124+
}
125+
ops.push(token);
126+
Log.debug("Push binary operator: " + token);
127+
} else if ("(".equals(token)) {
128+
ops.push(token);
129+
} else if (")".equals(token)) {
130+
while (!"(".equals(ops.peek())) {
131+
output.add(ops.pop());
145132
}
133+
ops.pop();
134+
if (!ops.isEmpty() && UNARY_OPERATORS.containsKey(ops.peek())) {
135+
output.add(ops.pop());
136+
}
137+
} else {
138+
Log.debug("Push token: " + token);
139+
output.add(token);
146140
}
147141
}
148142

0 commit comments

Comments
 (0)