我正在建立一个c解释器。我的AST使用复合模式。为了检查语义和执行操作,我想使用访问者模式。现在有一个问题。这是c-preprocessor的语法规则:if-section = if-group [elif-groups] [else-group] endif-line。 if-section的访问者需要有关子节点的信息,以了解必须跳过哪些组。在访问者模式中,每个“visit”-method都返回void。所以我无法获得有关这些节点的任何信息(只有向节点添加信息,但这很丑陋......)。有机会吗?
答案 0 :(得分:2)
您已经解决了这个问题:您必须在包含AST的原始数据之外提供其他信息。
您可以将所有额外信息与单个树节点相关联:如果您这样做,您将最终构建所谓的属性树。从理论上讲(如果你工作的话),你就可以完全理解这个想法。您的访问者可能必须检查/更新与其正在访问的AST节点相关的信息,而不是与关键子节点和父节点相关的信息。
在实践中,构建辅助数据结构(例如,符号表)是有用的,其可以在访问树时访问(并且更新)。最终会出现一种简并归因树:将符号表块与形成范围的AST节点相关联。
你人为地限制你的访客返回任何价值;如果您不这样做,子访问者可以将有用的值传递给父访问者,从而使父母可以更少地临时访问树。
在您的问题陈述中,您没有限制访问者将值传递给子级,因此您可以传递有用的值。要传递的一个非常有用的值是与周围范围关联的符号表,以便子访问者不必爬回树以查找范围节点和关联的符号表。