java - 如何通过实现ANTLR生成的Visitor来创建复杂的POJO
问题描述
我正在使用 ANTLR4,并为我正在设计的一种新语言编写了词法分析器和解析器语法。我想通过解析该语言来创建一个 Java POJO。
语言
{dept dept-name="human resources"}
{emp name="john doe" age=23 address="123 Main St, Spring Field, CO 12345" /}
{/dept}
Java POJO
public 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 类。Visitor 类采用泛型类型 T,并在访问每个节点时返回类型 T 的实例。我需要在访问 AST 的地址部分时返回一个地址,在访问 AST 的员工部分时需要返回一个员工。所以我不确定 Visitor 实现的类型 T 应该是什么。
我对如何通过实现 ANTLR 给出的访问者来构建上述部门 POJO 感到困惑。
PS:请注意,我无法更改部门、员工、地址类别。另外,请不要建议使用 XML 或 JSON。我只是想了解如何在 ANTLR 中解决这样的问题。
谢谢!
解决方案
假设这是你 parser.g4 语法的头你的整个脚本是 a 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,因此使用生成的树可能并不容易。
推荐阅读
- python - DataFrame Pandas - 如何将字典列表从每一行拆分为单独的列?
- node.js - 方法“collection.find()”最多接受两个参数
- java - RabbitMQ Spring Java - RPC 模式
- stored-procedures - 如何检查存储过程参数是否具有默认值(是否可为空)、数据类型等
- amazon-redshift - Postgres | 使用促销代码后获取所有 ID
- c++ - QLabel 不更新图像内容
- javascript - JavaScript 费用跟踪器计算器 - 减法
- quota - xfs_quota - 属性显示默认值并删除与配额相关的元数据
- java - Java Servlet 读取 URL 重定向后的参数
- java - 构建我的 Fabric Mod 时如何修复“未找到名称为 'compile' 的配置”错误