ANTLR4 - Ошибка кода соответствия шаблона дерева - PullRequest
0 голосов
/ 12 апреля 2020

Я в основном следую за шагом ответа в URL: ANTLR 4 - Соответствие шаблону дерева . Однако я получаю сообщение об ошибке:

Ошибка: (29, 5) java: не удается найти символ символа: класс JavaLexer расположение: класс Main.

Мой код точно такой же. Кажется, что Java не знает, что такое JavaLexer. Кто-нибудь может мне помочь?

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.pattern.ParseTreeMatch;
import org.antlr.v4.runtime.tree.pattern.ParseTreePattern;

import java.util.List;

public class Main {

  public static void main(String[] args) {

    String source = "package sampleCodes;\n" +
            "\n" +
            "public class fruits {\n" +
            "\n" +
            "  static { int q = 42; }\n" +
            "\n" +
            "  public static void main(String[] args){\n" +
            "    int a = 10;\n" +
            "    System.out.println(a);\n" +
            "  }\n" +
            "}\n";

    JavaLexer lexer = new JavaLexer(CharStreams.fromString(source));
    JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.compilationUnit();

    ParseTreePattern p = parser.compileParseTreePattern("<IDENTIFIER> = <expression>", JavaParser.RULE_variableDeclarator);
    List<ParseTreeMatch> matches = p.findAll(tree, "//variableDeclarator");

    for (ParseTreeMatch match : matches) {
      System.out.println("\nMATCH:");
      System.out.printf(" - IDENTIFIER: %s\n", match.get("IDENTIFIER").getText());
      System.out.printf(" - expression: %s\n", match.get("expression").getText());
    }
  }
}

1 Ответ

1 голос
/ 12 апреля 2020

Сначала вы должны сгенерировать классы лексера и парсера. Выполните следующие действия:

  1. скачайте ANTLR JAR: https://www.antlr.org/download/antlr-4.8-complete.jar (поместите его в ту же папку, что и файл Main.java)
  2. также в этом папку, загрузите файлы грамматики Java: https://raw.githubusercontent.com/antlr/grammars-v4/master/java/java/JavaLexer.g4 и https://raw.githubusercontent.com/antlr/grammars-v4/master/java/java/JavaParser.g4
  3. откройте терминал, перейдите к папке, которую вы скачали файлы и генерировать классы лексера и анализатора из грамматики Java:

    java -jar antlr-4.8-complete.jar *.g4
    
  4. скомпилировать все .java исходные файлы:

    javac -cp antlr-4.8-complete.jar *.java
    
  5. запустить класс Main:

    # For Mac & *nix
    java -cp antlr-4.8-complete.jar:. Main
    
    # or on Windows
    java -cp antlr-4.8-complete.jar;. Main
    

На вашей консоли будет напечатано следующее:

MATCH:
 - IDENTIFIER: q
 - expression: 42

MATCH:
 - IDENTIFIER: a
 - expression: 10
...