有没有人知道解析器的例子和理论,可以将(可能)抽象语法树转换为代码,而不是反过来。从数学上讲,至少直观上,我相信代码->AST的功能是可逆的,但我正在尝试寻找这方面的工作/示例......除了像龙书之类的常规资源之外。有什么想法吗?
有没有人知道解析器的例子和理论,可以将(可能)抽象语法树转换为代码,而不是反过来。从数学上讲,至少直观上,我相信代码->AST的功能是可逆的,但我正在尝试寻找这方面的工作/示例......除了像龙书之类的常规资源之外。有什么想法吗?
在Haskell中有可逆解析的理论、工作实现和示例。该库由Paweł Nowak制作。请参考https://hackage.haskell.org/package/syntax作为起点。你可以在以下URL中找到示例。
实际上,从解析树生成代码在数学意义上严格比解析代码更容易。有许多语法是模棱两可的,也就是说,没有唯一的解析方式,但是解析树总可以以唯一的方式转换为字符串,忽略空格。
龙书对解析器理论给出了很好的描述。
我比较喜欢lewap的回答:
找到一个数学方式来表达访问者,你就有了解析器的对偶
但是你要求一个样例,那么试试这个:Visual Studio包含一个具有出色对称性的UML编辑器。它和编辑器的实现方式都构成了模型的视图,而编辑任意一个都会修改模型,从而使所有内容保持同步。
我不知道在哪里可以找到更多关于这个理论的资料,但是boost::spirit 2.0有qi(解析器)和karma(生成器),它们共享相同的底层结构和语法,因此它是该概念的实际实现。
生成器方面的文档仍然非常薄弱(spirit2是Boost 1.38中的新产品,仍处于测试版阶段),但是有一些karma示例代码可用,并且据我所知,该库处于工作状态并且至少有一些示例可用。
听起来很像一个非优化编译器的后端,其目标语言与源语言相同。
一个问题是你是否需要“未解析”的代码与原始代码完全相同,还是仅在功能上等效即可。
例如,输出是否可以使用不同的缩进样式而不同于原始代码?因为这些信息通常不会存储在AST中,因为它们在语义上并不重要。
一个值得考虑的事情是自动代码重构工具。