package algorithm.expression;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TokenParser {
public static final List<String> OPERATORS =
Arrays.asList(Token.OP_ADD, Token.OP_SUB, Token.OP_MUL,
Token.OP_DIV, Token.OP_POWER, Token.OP_L_BRACKET, Token.OP_R_BRACKET);
public static List<Token> parse(String expression) {
return parse(expression, null);
}
public static List<Token> parse(String expression, String splitRegex) {
List<Token> tokens = new ArrayList<>();
String[] split = splitRegex == null || "".equals(splitRegex) ?
new String[]{expression} : expression.split(splitRegex);
for (String expr : split) {
int i = 0;
while (i < expr.length()) {
char c = expr.charAt(i);
if (isOperator(c)) {
Token t = new Token(Token.OPERATOR, String.valueOf(c));
tokens.add(t);
i++;
} else if (Character.isDigit(c)) {
int nextOperatorIndex = indexOfNextOperator(i, expr);
String value = expr.substring(i, nextOperatorIndex);
Token t = new Token(Token.NUMBER, value);
tokens.add(t);
i = nextOperatorIndex;
} else {
System.out.println("char :[" + c + "] is not number or operator,ignore");
i++;
}
}
}
return tokens;
}
private static int indexOfNextOperator(int i, String expr) {
while (Character.isDigit(expr.charAt(i))) {
i++;
if (i == expr.length()) {
break;
}
}
return i;
}
private static boolean isOperator(char c) {
String sc = String.valueOf(c);
return OPERATORS.contains(sc);
}
}