Как я могу изменить исходный код Java с помощью Python3 и ANTLR4? - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть набор исходных кодов Java, и мне нужно изменить эти файлы .java (удалить пробелы, комментарии и т. Д.). Для этого я загрузил файлы лексера и анализатора Java из этого репозитория и скомпилировал его, используя antlr-4.7.2-complete.jar. Я также установил antlr4-python3-runtime с помощью pip.

Я попытался удалить многострочный комментарий в примере программы HelloWorld с помощью приведенного ниже кода, но получил следующую трассировку. Как я могу решить эту проблему?

Для компиляции лексера и парсера:

java -jar [path_to_antlr-4.7.2-complete.jar] -Dlanguage=Python3 [path_to_lexer_file]
java -jar [path_to_antlr-4.7.2-complete.jar] -Dlanguage=Python3 [path_to_parser_file]

Пример файла Java:

public class HelloWorld {

    public static void main(String[] args){
        /*
        System.out.println("Hello World");
        */
    }

}

Python-код для изменения файлов:

source = open("./HelloWorld.java", "r")
codeStream = InputStream(source.read())
lexer = JavaLexer.JavaLexer(codeStream)
token_stream = CommonTokenStream(lexer)
token_stream.fill()
rewriter = TokenStreamRewriter.TokenStreamRewriter(token_stream)
for token in token_stream.tokens:
    if token.type == JavaLexer.JavaLexer.COMMENT:
        rewriter.deleteToken(token)

Traceback (most recent call last):
  File "/home/alp/PycharmProjects/JavaParsingTutorial/parser.py", line 31, in <module>
    rewriter.deleteToken(token)
  File "/usr/local/lib/python3.6/dist-packages/antlr4/TokenStreamRewriter.py", line 80, in deleteToken
    self.delete(self.DEFAULT_PROGRAM_NAME, token, token)
  File "/usr/local/lib/python3.6/dist-packages/antlr4/TokenStreamRewriter.py", line 88, in delete
    self.replace(program_name, from_idx, to_idx, None)
  File "/usr/local/lib/python3.6/dist-packages/antlr4/TokenStreamRewriter.py", line 71, in replace
    if any((from_idx > to_idx, from_idx < 0, to_idx < 0, to_idx >= len(self.tokens.tokens))):
TypeError: '>' not supported between instances of 'CommonToken' and 'CommonToken'
...