首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR的AST树语法+列表

ANTLR的AST树语法+列表
EN

Stack Overflow用户
提问于 2011-04-03 03:34:21
回答 1查看 2K关注 0票数 4

我已经读了很多书,试图找到一种方法来干净地使用ANTLR的树语法中的列表。这是我尝试过的和他们的结果(我真的希望我错过了一些琐碎的东西).

使用+=语法

代码语言:javascript
复制
program returns [someInterface result]
  : m+=method* EOF {result = new SomeClass(m);};

method returns [SomeMethod result] : <definition here>

这次失败了..。

规则'+=‘列表标签不允许w/o输出选项

如果我将输出设置为"AST“或"template”(唯一的选项),则生成的类的方法签名将发生更改。也就是说,m将不是由一个SomeMethod列表,而是一个节点或模板的列表。如果有办法使这一方法有效,我愿意听取建议。

使用规则Scopes

代码语言:javascript
复制
program returns [CompilesToJavaByteCode result]
    scope {
      List<SomeMethod> methods;
    }
    @init {
      $program::methods = new ArrayList<SomeMethod>();
    }
    : (m=method {$program::methods.add(m);})*
      EOF {result = new SomeClass($program::methods);};

这似乎是可行的,尽管我承认我还没有用嵌套/递归的情况来测试它。

最终目标

我希望构建一组表示我的语言(类、方法、变量、语句等)的类,以便在生成编译代码之前进行一些静态分析和优化。为此,我需要能够使用列表。我希望+=语法“只起作用”,但我可能遗漏了一些东西。第二种方法有效,但似乎过于冗长和不雅。

问题

在ANTLR的树语法中,为什么要使用一个列表来传递给我的具体类呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-03 05:54:59

您可以从示例中削减范围,并使用局部变量进行所有操作。

代码语言:javascript
复制
program returns [CompilesToJavaByteCode result]
    @init {
      List<SomeMethod> methods = new ArrayList<SomeMethod>();
    }
    : (m=method { methods.add($m.result); })* EOF 
      { $result = new SomeClass(methods); };

这就是我们在工作中对这个案子所做的。另一种选择是让您的方法规则处理它:

代码语言:javascript
复制
program returns [CompilesToJavaByteCode result]
    @init {
      List<SomeMethod> methods = new ArrayList<SomeMethod>();
    }
    : method[methods]* EOF { $result = new SomeClass(methods); };

method [List<SomeMethod> methods]
    : ...
      { methods.add(new SomeMethod(...); };

我真的不喜欢第二个选项,因为它是一个方法规则,可能不应该关心如何处理它的结果。但是,您可以想象一个结构,其中顶层规则创建了一个ClassBeingCompiled,其余的代码逐渐地用.addMethod()填充它。

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

https://stackoverflow.com/questions/5527400

复制
相关文章

相似问题

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