为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过实现ANTLR生成的Visitor来创建复杂的POJO

如何通过实现ANTLR生成的Visitor来创建复杂的POJO

郎朗坤 2021-07-09 14:01:15
我正在使用 ANTLR4,并为我正在设计的一种新语言编写了词法分析器和解析器语法。我想通过解析该语言来创建一个 Java POJO。语{dept dept-name="human resources"}   {emp name="john doe" age=23 address="123 Main St, Spring Field, CO 12345" /}{/dept}Java POJOpublic class Department {  private final class name;  private final List<Employee>}public class Employee {  private final String name;  private final int age;  private final Address address;}public class Address {  private final String streetAddress;  private final String city;  private final String state;  private final int zip;  private final int zipExt;}我已经能够正确定义语法。我能够使用 Antlr 工具生成访问者类。Visitor 类采用泛型类型 T,并在访问每个节点时返回类型 T 的实例。我需要在访问 AST 的地址部分时返回一个地址,而在访问 AST 的员工部分时需要返回一个员工。所以我不确定访问者实现的类型 T 应该是什么。我对如何通过实现 ANTLR 给出的访问者来构建上述部门 POJO 感到困惑。PS:请注意,我不能更改部门、员工、地址类。另外,请不要建议使用 XML 或 JSON。我只是想了解如何在 ANTLR 中解决这样的问题。
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

假设这是你的 parser.g4 语法的头部 你的整个脚本是一个file,file可以由多个元素组成。元素可以是 apage或 a pageGroup。而且page和pageGroup有其他成分。


parser grammar MyCustomParser;

file: element* EOF;

element: page | pageGroup;

然后一旦你运行 Antlr 命令你会得到许多生成的文件,其中大部分可能命名为MyCustomParser$XXXContext.class. 这些文件代表解析树中的节点。在我们的例子中,我们将有MyCustomParser.PageContext,MyCustomParser.PageGroupContext等等。


一个特别重要的节点是解析树的根节点MyCustomParser.FileContext。它的子元素将是元素上下文,元素上下文的子元素将是上面提到的页面上下文或页面组上下文。


现在有了这个根节点,你需要做的就是从根开始递归访问解析树中的所有节点。当您访问节点时,您可以根据存储在这些节点中的值生成您的 POJO。


获取根节点


//....

MyCustomParser parser = new MyCustomParser(tokens);

MyCustomParser.FileContext fileContext = parser.file();

注意我们调用了方法file()。方法名称与您的根规则名称相同。


您不必使用生成的树访问者。它只是帮助您节省一些锅炉模板代码,因为在大多数情况下,我们以相同的方式遍历这棵树或那棵树。


您提到了泛型类型问题。大多数时候,你的 POJO 可能有一个公共的父类,或者实现一个公共的接口。然后你可以只使用父类或接口。但是在您的情况下,您无法修改 POJO,因此使用生成的树可能并不容易。


查看完整回答
反对 回复 2021-07-14
  • 1 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号