修改分析树来评估模板语言中的继承

问题描述:

我正在为一个名为“block”的结构构建一个模板(如jinja,Twig)语言的linter程序。修改分析树来评估模板语言中的继承

我相信你们很多人都熟悉模板语言中块的概念。现在,包含这些块的模板可以被另一个模板,子模板,块的名称相同,以及定义它们自己的内容和功能所覆盖。

因此,在评估给定源代码(用于范围检查)时,要求我首先独立评估子模板中的所有块。然后,我必须将块放置在根模板中定义的位置,并再次进行评估,以检查是否存在违反根模板的模板范围属性(变量,宏等)的情况。

我开始使用ANTLR4来访问子模板。所以在ANTLR中,我碰到了这个块,我在那里评估它,然后在根模板的分析树上调用另一个访问者。

但是,如何将子块的内容放置在根模板中进行评估? ANTLR4中没有树的修饰/突变。我是新来的整个编译器和解析器范例。考虑到我的要求,任何人都可以建议从这里采取什么最好的方法? 此外,如果您觉得问题太模糊,或者我没有提供足够的信息,我随时准备回答您的任何其他问题。

这个问题 - 版本控制或继承 - 可以很容易地通过使用符号表来处理。

访问与根模板块相对应的上下文,为每个块保存相应的符号/值对。然后访问子块上下文以更新和/或添加到每个块的符号/值对。最后,评估符号表以读出合并结果。

此SO回答提供simple symbol table

Antlr git repo提供了一个示例fully-typed symbol table

+0

非常感谢@GRosenberg!不知道帕尔也写了一个符号表程序。我使用的是ANTLR的JS目标,所以请让我知道是否有类似的东西(完全符号表)存在。我目前正在尝试一个类似的解决方案,通过实现一个树DS非常类似于这个符号树的概念。我使用递归访问(使用ANLTR生成的访问者)来产生拾取并将块放入不同模板中进行评估的效果。目前正在实施它,会让你知道它是如何发展的。 – leonidas