Проблема с использованием JavaLexer и JavaParser с использованием Antlr4.7 в python

#java #python-3.x #antlr4 #abstract-syntax-tree

Вопрос:

Я скачал Antlr-4.7.1-complete.jar файл, а также скачал javalexer.g4 и javaparser.g4 с github и использовал следующую команду:

 java -jar ./antlr-4.7.1-complete.jar -Dlanguage=Python3 ./JavaLexer.g4
java -jar ./antlr-4.7.1-complete.jar -Dlanguage=Python3 ./JavaParser.g4
 

и получил JavaLexer.py и JavaParser.py файл.
Когда я использую следующий код для создания AST из исходного кода java, он выдает ошибку, указывающую, что JavaLexer не определен.

Как импортировать/использовать javalexer и javaparser в следующем коде?

 from antlr4 import FileStream, CommonTokenStream, ParseTreeWalker

source = open("sample.java", "r", encoding="utf-8")
input_stream = InputStream(source.read())
print(input_stream)
lexer = JavaLexer(input_stream)
token_stream = CommonTokenStream(lexer)
parser = JavaParser(token_stream)
tree = parser.compilationUnit()
print(tree.toStringTree(recog=parser))
 

Комментарии:

1. Давайте сначала начнем с вызова инструмента Antlr. Я не понимаю, почему вы используете версию 4.7.1 инструмента Antlr для создания лексера, а затем версию 4.6 инструмента Antlr для создания синтаксического анализатора. Вы не можете просто смешивать и сопоставлять версии. Но почему ты просто не используешь новейшие, antlr-4.9.2-complete.jar?

2. извините за версию 4.6, это была опечатка.

3. Основная проблема заключается в том, как включить javalexer и javaparser в код.

4. В вашей основной программе (Main.py), замените эту 1-ю строку на from antlr4 import *; from JavaLexer import *; from JavaParser import *; и поместите все ваши файлы в один каталог. Затем, pip install antlr4-python3-runtime; java -jar antlr-4.9.2-complete.jar -encoding utf-8 -Dlanguage=Python3 *.g4; python Main.py . Смотрите код по адресу github.com/antlr/antlr4/blob/master/doc/…

5. Теперь это работает. Огромное спасибо.