|
7 | 7 | import java.util.List; |
8 | 8 | import java.util.Map; |
9 | 9 | import java.util.Queue; |
10 | | -import java.util.Scanner; |
11 | 10 | import java.util.Deque; |
12 | 11 | import java.util.function.BiFunction; |
13 | 12 | import java.util.function.Function; |
| 13 | +import java.util.regex.Matcher; |
14 | 14 | import java.util.regex.Pattern; |
15 | 15 |
|
16 | 16 | import arc.util.Log; |
@@ -110,39 +110,33 @@ private Queue<String> toExpressionQueue(String expr, Map<String, Object> variabl |
110 | 110 | Deque<String> ops = new ArrayDeque<>(); |
111 | 111 | Queue<String> output = new LinkedList<>(); |
112 | 112 |
|
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()); |
145 | 132 | } |
| 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); |
146 | 140 | } |
147 | 141 | } |
148 | 142 |
|
|
0 commit comments