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



我正在为一种模板(如jinja,Twig(语言构建一个linter程序,该语言具有称为"块"的结构。

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

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

我首先使用 ANTLR4 访问子模板。所以在 ANTLR 中,我点击块,在那里评估它,然后在根模板的解析树上调用另一个访问者。

但是,如何将子块的内容放在根模板中进行评估呢?ANTLR4中没有树修饰/突变。我是整个编译器和解析器范式的新手。考虑到我的要求,谁能建议从这里采取的最佳方法是什么? 我也准备回答你的任何其他问题,以防你觉得这个问题太模糊,或者我没有提供足够的信息。

这个问题 -版本控制或继承 - 可以通过使用符号表轻松处理。

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

这个 SO 答案提供了一个简单的符号表。

Antlr git 存储库提供了一个示例性的全类型符号表。

相关内容

  • 没有找到相关文章

最新更新