0

我正在为具有称为“块”的结构的模板(如 jinja、Twig)语言构建一个 linter 程序。

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

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

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

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

4

1 回答 1

0

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

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

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

Antlr git repo 提供了一个示例性的全类型符号表

于 2017-07-11T17:54:43.327 回答