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