Compiler construction 如何在使用CST生成的AST时漂亮地打印源代码

Compiler construction 如何在使用CST生成的AST时漂亮地打印源代码,compiler-construction,abstract-syntax-tree,parse-tree,concrete-syntax-tree,Compiler Construction,Abstract Syntax Tree,Parse Tree,Concrete Syntax Tree,我知道用CST打印代码非常简单,因为语法信息存储在节点中 然而,当转换为AST时,源代码的大部分初始结构都会因去糖和其他转换而丢失。因此,如果AST经过了这些主要的翻译,它如何打印源代码呢?它是否包含对用于生成它的AST的引用(以及完美复制源代码所需的语法/结构)?为什么要将AST打印为源代码?打印AST本身。@SK logic例如,如果发生运行时错误,最好给出发生错误的源代码。但是,由于AST已被修改,它将无法生成与输入完全相同的源代码。当您报告错误时,您不应该指向一些打印得很好、经过大量转换

我知道用CST打印代码非常简单,因为语法信息存储在节点中


然而,当转换为AST时,源代码的大部分初始结构都会因去糖和其他转换而丢失。因此,如果AST经过了这些主要的翻译,它如何打印源代码呢?它是否包含对用于生成它的AST的引用(以及完美复制源代码所需的语法/结构)?

为什么要将AST打印为源代码?打印AST本身。@SK logic例如,如果发生运行时错误,最好给出发生错误的源代码。但是,由于AST已被修改,它将无法生成与输入完全相同的源代码。当您报告错误时,您不应该指向一些打印得很好、经过大量转换的AST-您必须按原样打印源代码,而是指向一个准确的位置(行号+列)。如何将调试信息存储在可执行代码中则是另一回事。通常AST保存对每个节点开始(和结束,可能)的行号和列号的引用,以便可以查找源代码。因为您的问题并没有询问具体的实现,所以对于AST如何做到这一点没有真正的答案,只有AST如何做到这一点。