我想在Python中使用ANTLR构建Java解析器。
我从ANTLR存储库下载了语法:
Lexer:https://github.com/antlr/grammars-v4/blob/master/java/java/JavaLexer.g4
解析器:https : //github.com/antlr/grammars-v4/blob/master/java/java/JavaParser.g4
然后我用script.bat生成了我需要的python代码:
java -jar antlr-4.8-complete.jar -Dlanguage=Python3 Java8Lexer.g4
java -jar antlr-4.8-complete.jar -Dlanguage=Python3 Java8Parser.g4
antlr-4.8-complete.jar
在此处下载:https : //www.antlr.org/download/antlr-4.8-complete.jar
这生成了以下文件列表:
然后,我编写了以下代码来解析Java文件:
import antlr4
from antlr4 import \* from java.antlr_unit2 import Java8Parser, Java8Lexer
def main():
code = open('test.txt', 'r').read()
lexer = Java8Lexer.Java8Lexer(antlr4.InputStream(code))
stream = antlr4.CommonTokenStream(lexer)
parser = Java8Parser.Java8Parser(stream)
tree = parser.expression()
print (tree)
if __name__ == '__main__':
main()
我的测试Java代码test.txt
是这样的:
package org.jabref.gui.fieldeditors;
import java.util.ArrayList;
/\*
* This class contains some code
\*
public class TextInputControlBehavior {
private static final boolean SHOW_HANDLES = Properties.IS_TOUCH_SUPPORTED && !OS.OS_X;
}
由于这太短了,因此以下是我要解析的代码示例:https : //pastebin.com/KNxfasKQ
当我运行此代码时,我得到了:
line 1:0 extraneous input 'package' expecting {'boolean', 'byte', 'char', 'double', 'float', 'int', 'long', 'new', 'short', 'super', 'this', 'void', IntegerLiteral, FloatingPointLiteral, BooleanLiteral, CharacterLiteral, StringLiteral, 'null', '(', '!', '~', '++', '--', '+', '-', Identifier, '@'}
[]
难道我做错了什么?我没有写语法,只是从ANTLR回购中获取的。
编辑:* Pavel Smirnov *的回答帮助了我,现在我没有得到警告。但是现在程序看起来真的很慢,我得到一棵空树作为输出。
解决:我正在打印tree
但我必须print(tree.toStringTree(recog = parser))
所以最终的代码是:
import antlr4
from antlr4 import \* from java.antlr_unit2 import Java8Parser, Java8Lexer
def main():
code = open('test.txt', 'r').read()
lexer = Java8Lexer.Java8Lexer(antlr4.InputStream(code))
stream = antlr4.CommonTokenStream(lexer)
parser = Java8Parser.Java8Parser(stream)
tree = parser.compilationUnit()
print(tree.toStringTree(recog=parser))
if __name__ == '__main__':
main()
问题来源:stackoverflow
你好,我和你一样想使用antlr4库,但是一直报错ModuleNotFoundError: No module named 'antlr4',请问您知道是怎么回事吗?
您的文本文件包含一个compilationUnit
,而不是您尝试解析的expression
tree = parser.expression()
仔细查看解析器规则,您需要的规则是
compilationUnit
: packageDeclaration? importDeclaration* typeDeclaration* EOF
;
这必须称为
tree = parser.compilationUnit()
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。