1 回答

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,因此使用生成的树可能并不容易。
添加回答
举报