gpt4 book ai didi

java - 有没有使用antlr4从java源代码创建AST并提取方法、变量和注释的简单示例?

转载 作者:行者123 更新时间:2023-12-01 19:21:36 24 4
gpt4 key购买 nike

有人可以提供一个详细的例子来说明如何使用 antlr4 来做到这一点吗?非常感谢安装 antlr4 及其依赖项的正确说明。

最佳答案

就是这里。

首先,您要购买 ANTLR4 书;-)

其次,您将下载 antlr4 jar 和 java 语法 ( http://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference )

然后,您可以稍微更改语法,将它们添加到标题中

    (...)
grammar Java;

options
{
language = Java;
}

// starting point for parsing a java file
compilationUnit
(...)

我会改变一些语法只是为了说明一些事情。

/*
methodDeclaration
: (type|'void') Identifier formalParameters ('[' ']')*
('throws' qualifiedNameList)?
( methodBody
| ';'
)
;
*/
methodDeclaration
: (type|'void') myMethodName formalParameters ('[' ']')*
('throws' qualifiedNameList)?
( methodBody
| ';'
)
;

myMethodName
: Identifier
;

你看,原始语法不允许你从任何其他标识符中识别方法标识符,因此我注释了原始 block 并添加了一个新 block ,只是为了向你展示如何获得你想要的东西。

您必须对要检索的其他元素执行相同的操作,例如当前刚刚跳过的评论。那是给你的:-)

现在,创建一个这样的类来生成所有 stub

package mypackage;

public class Gen {

public static void main(String[] args) {
String[] arg0 = { "-visitor", "/home/leoks/EclipseIndigo/workspace2/SO/src/mypackage/Java.g4", "-package", "mypackage" };
org.antlr.v4.Tool.main(arg0);
}

}

运行 Gen,您将在 mypackage 中获得一些为您创建的 java 代码。

现在创建一个访客。实际上,在此示例中访问者将解析自身

package mypackage;

import java.io.FileInputStream;
import java.io.IOException;

import mypackage.JavaParser.MyMethodNameContext;

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

/**
* @author Leonardo Kenji Feb 4, 2014
*/
public class MyVisitor extends JavaBaseVisitor<Void> {

/**
* Main Method
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ANTLRInputStream input = new ANTLRInputStream(new FileInputStream("/home/leoks/EclipseIndigo/workspace2/SO/src/mypackage/MyVisitor.java")); // we'll
// parse
// this
// file
JavaLexer lexer = new JavaLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
ParseTree tree = parser.compilationUnit(); // see the grammar ->
// starting point for
// parsing a java file



MyVisitor visitor = new MyVisitor(); // extends JavaBaseVisitor<Void>
// and overrides the methods
// you're interested
visitor.visit(tree);
}

/**
* some attribute comment
*/
private String someAttribute;

@Override
public Void visitMyMethodName(MyMethodNameContext ctx) {
System.out.println("Method name:" + ctx.getText());
return super.visitMyMethodName(ctx);
}

}

就是这样。

你会得到类似的东西

Method name:main
Method name:visitMyMethodName

ps。还有一件事。当我在 eclipse 中编写这段代码时,我遇到了一个奇怪的异常。这是由 Java 7 引起的,只需将这些参数添加到编译器中即可修复(感谢此链接 http://java.dzone.com/articles/javalangverifyerror-expecting )

enter image description here

关于java - 有没有使用antlr4从java源代码创建AST并提取方法、变量和注释的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com