首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解树在反trees中的作用

了解树在反trees中的作用
EN

Stack Overflow用户
提问于 2009-11-24 14:46:06
回答 2查看 3K关注 0票数 6

我试图将Antlr用于一些类似于文本IDE的函数,特别是解析一个文件,以确定代码折叠和应用语法高亮的点。

第一个问题-- Antlr是否适合这一要求,还是过分了?这可以使用regex和/或手动解析器来实现.但看来Antlr是来帮我做这件事的。

我已经看过.以及优秀的教程资源这里

我已经成功地构建了一个Java语法(使用标准语法),并将所有内容整齐地解析成一棵树。但是,我希望看到嵌套在树中的元素。事实上,每件事都是最高级元素的一个子元素。

例如:给予:

代码语言:javascript
复制
package com.example
public class Foo {
   String myString = "Hello World"
   // etc
}

我原以为Foo的树节点是包声明节点的子节点。同样,myString也是Foo的孩子。

相反,我发现FoomyString (以及其他一切)都是package的子代。

下面是进行解析的相关摘录:

代码语言:javascript
复制
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实例,其子实例是解析的结果。

期望值(可能不正确)

代码语言:javascript
复制
package com.example (4 tokens)
   |
   +-- public class Foo (3 tokens)
        |
        +--- String myString = "Hello World" (4 tokens)
        +--- Comment "// etc"

(或类似的)

实际值(所有值都是result.getTree()根节点的子值)

代码语言:javascript
复制
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"

我对该如何运作的理解是否正确?

到目前为止,我是Antlr的一个新手,我发现学习曲线非常陡峭。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-03 19:13:36

antlr.org文件共享部分顶部的Java-6语法不包括树构建。你需要做两件事。首先,告诉ANTLR您想要构建AST:

代码语言:javascript
复制
options {
    output=AST;
}

其次,您需要通过使用树运算符或使用重写规则来告诉它树应该是什么样子。见关于树木建设的文献。我通常会把两者结合在一起。

票数 6
EN

Stack Overflow用户

发布于 2009-11-24 18:15:19

要构建树,应该设置output=AST。(抽象语法树)

据我所知,在一个ANTLR中,只有一个标记可以是树的根,所以你不能准确地得到你想要的东西,但是你可以接近它。

退房:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1790528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档