Как построить парсер Java для векторов? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь построить парсер для векторов (и в конечном итоге сделаю это для матриц)

В моем тестовом классе у меня есть это:

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

        }
    }
...