Я пытаюсь построить парсер для векторов (и в конечном итоге сделаю это для матриц)
В моем тестовом классе у меня есть это:
Parser parser = new Parser();
try {
VectorExpressionNode expression = parser.parse("{1.2, 4.2, 5.2}+{1.0, 2.0,3.0}");
System.out.println("The value of the expression is "+expression.getValue()[0]);
}
catch (ParserException e) {
System.out.println("Parser Exception" + e.getMessage());
}
catch (EvaluationException e) {
System.out.println("Evaluation Exception " + e.getMessage());
}
Но это не парсинглиния.Я уверен, что проблема была с регулярным выражением, которое я использую для массивов.Вот метод, который я использую (FYI: Tokenize - класс, который маркирует входные токены)
private static Tokenizer createExpressionTokenizer()
{
Tokenizer tokenizer = new Tokenizer();
tokenizer.add("[+-]", Token.PLUSMINUS);
tokenizer.add("[*]", Token.MULT);
tokenizer.add("\\{\\s*(\\d+(\\s*,\\s*\\d+)*\\s*)?\\}", Token.ARRAY);//I think the program doesn't get this
return tokenizer;
}
Когда я запустил программу, я заметил, что она не может пройти через "if (m.find ())" линия.Это метод, который читает токены из ввода:
public void tokenize(String str) throws Exception {
String s = new String(str);
int totalLength = s.length();
tokens.clear();
while(!s.equals("")) {
int remaining = s.length();
boolean match = false;
for (TokenInfo info: tokenInfos) {
Matcher m = info.regex.matcher(s);
System.out.println(m.toString());
if (m.find()) { //the program is not entering this block
match = true;
String tok = m.group().trim();
tokens.add(new Token(info.token, tok, totalLength - remaining));
s = m.replaceFirst("");
break;
}
}
if (!match) throw new Exception(); //as a result, throws this exception
}
}