Java 理解ANTLR中的树
我正在尝试将Antlr用于一些类似于文本IDE的函数——特别是解析文件以识别代码折叠点和应用语法高亮显示点 第一个问题-Antlr是否适用于此要求,或者是否过度使用?这可以通过使用正则表达式和/或手动解析器来实现。。。但似乎Antlr是为我做这项工作的 我已经看过了。。。以及优秀的教程资源 我已经设法构建了一个Java语法(使用),并将所有内容整齐地解析到一个树中。但是,我希望看到嵌套在树中的元素。事实上,一切都是顶级元素的子元素 例如,给定:Java 理解ANTLR中的树,java,antlr,Java,Antlr,我正在尝试将Antlr用于一些类似于文本IDE的函数——特别是解析文件以识别代码折叠点和应用语法高亮显示点 第一个问题-Antlr是否适用于此要求,或者是否过度使用?这可以通过使用正则表达式和/或手动解析器来实现。。。但似乎Antlr是为我做这项工作的 我已经看过了。。。以及优秀的教程资源 我已经设法构建了一个Java语法(使用),并将所有内容整齐地解析到一个树中。但是,我希望看到嵌套在树中的元素。事实上,一切都是顶级元素的子元素 例如,给定: package com.example publi
package com.example
public class Foo {
String myString = "Hello World"
// etc
}
我希望Foo的树节点是包声明节点的子节点。同样,myString也会是Foo的孩子
相反,我发现Foo
和myString
(以及其他相关内容)都是包的子项
下面是进行分析的相关摘录:
public void init() throws Exception {
CharStream c = new ANTLRFileStream(
"src/com/inversion/parser/antlr/Test.code");
Lexer lexer = new JavaLexer(c);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
parser.setTreeAdaptor(adaptor);
compilationUnit_return result = parser.compilationUnit();
}
static final TreeAdaptor adaptor = new CommonTreeAdaptor() {
public Object create(Token payload) {
if (payload != null)
{
System.out.println("Create " + JavaParser.tokenNames[payload.getType()] + ": L" + payload.getLine() + ":C" + payload.getCharPositionInLine() + " " + payload.getText());
}
return new CommonTree(payload);
}
};
检查result.getTree()
返回一个CommonTree
实例,其子实例是解析的结果
预期值(可能不正确)
(或类似的东西)
实际值(所有值都是result.getTree()的根节点的子节点
)
我对如何工作的理解正确吗
到目前为止,我在Antlr是一个彻头彻尾的傻瓜,我发现学习曲线非常陡峭。要构建树,应该设置output=AST。(抽象语法树)
据我所知,在一个ANTLR中,只有一个标记可以是树的根,所以你不能得到你想要的东西,但是你可以接近它
退房:
上文件共享部分顶部的Java-6语法不包括树构建。你需要做两件事。首先,告诉ANTLR您要构建AST:
options {
output=AST;
}
其次,您需要通过使用树操作符或使用重写规则来告诉它树应该是什么样子。看。我通常会将两者结合起来。你能按你找到的树显示出来吗?你能按你预期的树显示出来吗?顺便说一句,用正则表达式无法解析非正则语言。每当你看到“tree”、“recursive”或“nested”时,就想想“no regex”。@Svante-当然-我在文章中扩展了预期值与实际值。希望这有帮助,马蒂。我已经使用ANTLR在IDE中创建了一个语法着色程序,所以我可以保证这是可能的。如果有帮助的话,这里是它的来源:。如果你在那棵树上和橄榄树上闲逛,也许会有帮助。(这是我自己的一种愚蠢的语言)
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
options {
output=AST;
}