ANTLR4 - 从非文件输入生成代码?

ANTLR4 - Generate code from non-file inputs?

我们从哪里开始手动构建 CST?还是 ANTLR4 总是需要 lex/parse 过程作为我们的输入步骤?

我的程序中有一些表示代码结构的视觉元素。

例如一个正方形代表一个 class,而嵌入该正方形中的一个圆代表一个方法。

现在我想把它们变成代码。我如何使用 ANTLR4 在 运行 时间(使用 ANTLR4.js)执行此操作?大多数 ANTLR 示例似乎都依赖于对现有代码进行词法分析和解析以获取语法树。所以而不是:

input code->lex->parse->syntax tree->output code (1)

我要

manually create syntax tree->output code (2)

(稍后,当用户向 class 及其方法添加代码时,ANTLR 将像 (1) 中一样使用。)

编辑 也许我误解了这一点。我是否创建一些自定义数据结构,然后 运行 解析器对其进行解析?即 write structures to some in-memory format->parse->output code (3)?

IIUC,你可以直接使用StringTemplate。

作为背景,Antlr 本身构建了一个内存中的解析树,然后遍历它,逐步调用 StringTemplate 以输出由相应的解析树节点数据限定的代码片段。 Antlr 使用内部解析树只是为了简化步行(因为 Antlr 是使用 Antlr 构建的)。

如果你有自己的数据结构,不管它的具体实现如何,程序化处理它以逐步调用 ST 模板发出相应的代码。而且,如果它们满足您的要求,您可以直接使用 Antlr 使用的相同模板 (JavaScript.stg)。

当然,如果您的数据结构具有可以被 lex'd/parsed 转化为标准 Antlr 解析树的性质,那么您可以使用标准 Antlr 访问器来调用和填充特定于节点的模板.