当前位置: 首页 > 知识库问答 >
问题:

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

高迪
2023-03-14

从这里使用Lexer和解析器:

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

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

使用antlr-4.6生成Python3目标

antlr-4.6-complete.jar语言 /JavaLexer.g4

java-jar/antlr-4.6-完成。jar-Dlanguage=Python3/JavaParser。g4

但是,我无法在生成的解析器上运行compilationUnit()方法。这是错误的说法

IPDB

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'

Lexer工作正常,解析器会解析它。我的代码是:

stream=antlr4。输入流(代码)

JavaLexer(流)

toks=antlr4。通用令牌流(lexer)

parser=JavaParser(流)

共有1个答案

范豪
2023-03-14

你的代码不正确。试试这个:

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);

此外,使用最新的稳定ANTLR版本(4.7)。

 类似资料:
  • 我正在尝试将ANTLR3语法转换为ANTLR4语法,以便在ANTLR4-python2-runtime中使用它。该语法是一个C/C模糊解析器。 转换后(基本上删除树运算符和语义/语法谓词),我使用以下方式生成Python2文件: 并且代码生成时没有任何错误,所以我将其导入我的python项目(我使用PyCharm)进行一些测试: 我的假设是正确的还是在转换语法时犯了一些错误?我们可以做些什么来让解

  • 我使用antlr4使用Python3生成python目标。antlr语法库中的g4语法文件。生成的Python3Lexer。py文件包含我需要翻译成python的Java代码。这里是它输出的两个java段,您也可以在python3语法文件中找到它们 和 我把这些翻译成: 和 这是我的python脚本,用于运行antlr输出,其中包含python而不是java片段。使用命令运行 It错误并打印以下跟

  • 需要一个用作所有函数的返回类型的类型。如果我需要生成一个AST,我应该使用什么返回类型?ANTLR3使用了 对象。 当输入节点时,我可以创建树的一个节点,但应该如何跟踪它的父节点? 关于如何将树重写规则转换为生成AST节点的方法,是否有任何示例?如果不是,是否可以为下面的规则提供一个示例? 下面是(3)的规则:

  • 本文向大家介绍基于python3生成标签云代码解析,包括了基于python3生成标签云代码解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于python3生成标签云代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 标签云是现在大数据里面最喜欢使用的一种展现方式,其中在python3下也能实现标签云的效果,贴图如下: ---

  • 我在这里使用的是一步语法,当我运行grun时,它非常有效: 但是,当使用具有以下代码的生成的java解析器运行时: 我得到这个错误:

  • 问题内容: 我正在尝试解析一个较大的fasta文件,并且遇到内存不足的错误。一些建议,以改善数据处理将不胜感激。当前程序正确打印出名称,但是部分通过文件我得到一个MemoryError 这是发电机 这是呼叫者存根,这部分工作后会添加更多 对于那些不熟悉fasta格式的人,这里是一个示例 每个条目均以“>”开头,说明名称等,然后接下来的N行是数据。除了下一行开头有“>”的行以外,没有定义的数据结尾。