简体   繁体   English

使用ANTLR 4在Python 3中生成Java解析器

[英]Generating a Java Parser in Python 3 using ANTLR 4

Using the Lexer and the Parser from here: 从此处使用Lexer和解析器:

https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaLexer.g4 https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaLexer.g4

https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaParser.g4 https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaParser.g4

with antlr-4.6 to generate Python3 targets 用antlr-4.6生成Python3目标

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

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

However, im unable to run the compilationUnit() method on the generated parser. 但是,im无法在生成的解析器上运行compilationUnit()方法。 It errors out saying 说错了

ipdb> parser.compilationUnit() ipdb> parser.compilationUnit()

File "/home/sviyer/onmt-fresh/java/JavaParser.py", line 1063, in compilationUnit
    localctx = JavaParser.CompilationUnitContext(self, self._ctx, self.state)
  File "/home/sviyer/.conda/envs/allennlp/lib/python3.6/site-packages/antlr4/error/ErrorStrategy.py", line 223, in sync
    raise InputMismatchException(recognizer)
antlr4.error.Errors.InputMismatchException: None

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "TestAntlr.py", line 13, in <module>
    parser.compilationUnit()
  File "/home/sviyer/onmt-fresh/java/JavaParser.py", line 1063, in compilationUnit
    localctx = JavaParser.CompilationUnitContext(self, self._ctx, self.state)
  File "/home/sviyer/.conda/envs/allennlp/lib/python3.6/site-packages/antlr4/error/ErrorStrategy.py", line 126, in reportError
    self.reportInputMismatch(recognizer, e)
  File "/home/sviyer/.conda/envs/allennlp/lib/python3.6/site-packages/antlr4/error/ErrorStrategy.py", line 266, in reportInputMismatch
    + " expecting " + e.getExpectedTokens().toString(recognizer.literalNames, recognizer.symbolicNames)
  File "/home/sviyer/.conda/envs/allennlp/lib/python3.6/site-packages/antlr4/error/ErrorStrategy.py", line 522, in getTokenErrorDisplay
    s = t.text
AttributeError: 'int' object has no attribute 'text'

The Lexer works fine though and the parser parses it. 词法分析器工作正常,但解析器对其进行了解析。 My code is: 我的代码是:

stream = antlr4.InputStream(code) 流= antlr4.InputStream(代码)

lexer = JavaLexer(stream) lexer = JavaLexer(流)

toks = antlr4.CommonTokenStream(lexer) 托克斯= antlr4.CommonTokenStream(lexer)

parser = JavaParser(stream) 解析器= JavaParser(流)

Your code is incorrect. 您的代码不正确。 Try this one: 试试这个:

code = open('sample.java', 'r').read()
codeStream = InputStream(code)
lexer = JavaLexer(codeStream)

# First lexing way
tokensStream = CommonTokenStream(lexer)
parser = JavaParser(tokensStream)

# Second lexing way
'''tokens = lexer.getAllTokens()
tokensSource = ListTokenSource(tokens)
tokensStream = CommonTokenStream(tokensSource)
parser = JavaParser(tokensStream)'''

tree = parser.compilationUnit()
print "Tree " + tree.toStringTree(recog=parser);

Also, use the latest stable ANTLR version (4.7). 另外,请使用最新的稳定ANTLR版本(4.7)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM