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

ANTLR4-从非文件输入生成代码?,antlr,antlr4,Antlr,Antlr4,我们从哪里开始手动从头构建CST?还是ANTLR4总是需要lex/parse过程作为我们的输入步骤? 我的程序中有一些表示代码结构的可视元素 e、 一个正方形代表一个类,而嵌入其中的一个圆圈代表一个方法 现在我想把它们转换成代码。在运行时(使用ANTLR4.js),如何使用ANTLR4来实现这一点?大多数ANTLR示例似乎都依赖于对现有代码进行词法分析和解析来获得语法树。因此,不是: input code->lex->parse->syntax tree->output code(1) 我想要

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

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

e、 一个正方形代表一个类,而嵌入其中的一个圆圈代表一个方法

现在我想把它们转换成代码。在运行时(使用ANTLR4.js),如何使用ANTLR4来实现这一点?大多数ANTLR示例似乎都依赖于对现有代码进行词法分析和解析来获得语法树。因此,不是:

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

我想要

手动创建语法树->输出代码(2)

(稍后,当用户向该类及其方法添加代码时,将使用ANTLR,如
(1)


编辑也许我误解了这一点。我是否创建一些自定义数据结构,然后在其上运行解析器?i、 e.
将结构写入内存格式->解析->输出代码(3)

IIUC,您可以直接使用StringTemplate

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

如果您有自己的数据结构,无论其具体实现如何,都可以按过程处理它,以逐步调用ST模板来发出相应的代码。而且,如果满足您的需求,您可以直接使用Antlr使用的相同模板()


当然,如果您的数据结构具有可以被解析为标准Antlr解析树的性质,那么您可以使用标准Antlr访问者来调用和填充特定于节点的模板。

ANTLR4不创建任何AST,它只能创建CST。如果你想自己建立一个CST,到底是什么阻止了你这么做?@Lucastzesniewski对不起,我是新手。我认为CST指的是ANTLR所称的解析树。我想要一个AST,因为它允许我使用相同的源代码树来读/写两种语言(C&JS)的源代码。但我不需要这些在同一时间。。。一个项目将写在一个或其他。。。因此,没有任何东西可以阻止我读取当前项目的源代码(C或JS),然后相应地输出。@Lucastrezesniewski我可以安全地假设没有办法在ANTLR4中手动构建树(与3相反)?因此,我们必须用lex/解析某些字节流来构建它?是的,具体的语法树只是解析树的同义词。如果你想在ANTLR4中使用AST,你必须自己构建一个,但这很容易,我写了一篇关于这一点的文章。如果你想保持CST水平,没有什么可以阻止你自己建立一个,这正是ANTLR在幕后所做的。:)您可能会发现对AST/CST的讨论很有用:您还有一个问题没有提到:给定一个组装好的AST/CST,您将如何取回有效文本?请参阅关于如何预打印的回答:这让我进行了一次愉快的追逐,在追逐过程中,我发现ANTLR4没有C.stg(ANTLR3没有C.stg;我仍在考虑该选项)。编写.stg是一项特别重要的任务,不建议新手使用ANTLR4或CodeGen目标语言。所以是ANTLR3或其他方式。谢谢另外,您所说的“特定于节点的模板”是什么意思?数据结构中与正方形对应的节点将与类模板关联;圈出一个方法模板。C.stg并非特定于Antlr3或4。它特定于StringTemplate的版本。不要认为StringTemplate的语法在一段时间内发生了实质性的变化。呃,我能理解ANTLR在这些级别上使用模板吗?如果是这样的话,最好能对此进行处理,这样我就可以去查找它了。StringTemplate.org