我正在构建一个用于模板化(如jinja,Twig)语言的linter程序,该语言具有称为“块”的结构。
我相信很多人都熟悉模板语言中块的概念。现在,包含这些块的模板可以被另一个模板覆盖,子模板具有相同的块名称,并为其定义自己的内容和功能。
因此,在评估给定的源代码(用于范围检查)时,要求是我首先独立地评估子模板中的所有块。然后,我必须将块放在根模板中定义它们的位置,并且应该再次进行评估,以便检查是否违反了根模板的模板范围属性(变量,宏等)。
我开始使用ANTLR4访问子模板。所以在ANTLR中,我点击了块,我在那里进行评估,然后在根模板的解析树上调用另一个访问者。
但是如何将子块的内容放在根模板中进行评估? ANTLR4中没有树修饰/突变。我是这个整个编译器和解析器范例的新手。考虑到我的要求,有谁可以建议从这里采取什么是最好的方法? 此外,我准备回答您遇到的任何其他问题,以防您觉得问题太模糊,或者我没有提供足够的信息。
答案 0 :(得分:0)
这个问题 - 版本控制或继承 - 可以通过使用符号表轻松处理。
访问与根模板块对应的上下文,为每个块保存相应的符号/值对。然后访问子块上下文以更新和/或添加每个块的符号/值对。最后,评估符号表以读出合并的结果。
此SO答案提供了simple symbol table。
Antlr git repo提供了一个示例性的fully-typed symbol table。