我正在尝试在Arpeggio PEG解析器中实现一个Node Transformer类。但是,不支持复制节点进行修改(例如,深度复制在节点上不起作用)。其主要目标是在小型编程语言中实现预处理和语法糖。
欢迎任何关于如何做到这一点的提示。
谢谢!
发布于 2017-07-04 17:25:25
在Arpeggio中实现树转换的惯用方法是使用visitors。
Arpeggio中的
是一种访问者模式,用于语义分析。您编写了一个python类,该类继承了PTNodeVisitor并具有visit_(self,node,children)形式的方法,其中规则名称是来自语法的规则名称。
在语义分析期间,将以深度优先的方式遍历解析树,并为每个节点调用适当的访问者方法,以将其转换为其他形式。然后将结果提供给父节点访问者方法。重复此过程,直到处理完最终的顶级解析树节点(调用其访问者)。顶级节点的结果是语义分析的最终输出。
编辑:不编辑PT节点。而是创建您的对象。这将要求您首先设计您的语言AST模型(元模型),然后在树节点访问期间实例化此模型的元素。
对于复杂的解析树转换,您可以研究textX source code。
如果你正在开发一种小型语言,我强烈建议你仔细研究一下textX。与传统的解析技术相比,它的使用要容易得多。
https://stackoverflow.com/questions/44626246
复制相似问题