当前位置: 首页 > 面试题库 >

如何用Python编写抽象语法树的访客模式?

潘翊歌
2023-03-14
问题内容

我的同事建议我写一个访客模式来浏览AST。谁能告诉我更多我将如何开始写它?

据我了解,AST中的每个Node都有visit()方法(?),它将以某种方式被调用(从哪里?)。到此结束我的理解。

为了简化一切,假设我有节点RootExpressionNumberOp和树是这个样子:

       Root
        |
       Op(+)
      /   \
     /     \
 Number(5)  \
             Op(*)
             /   \
            /     \
           /       \
       Number(2)   Number(444)

谁能想到访客模式将如何访问此树以产生输出:

 5 + 2 * 444

谢谢,博达·西多(Boda Cydo)。


问题答案:

Wikipedia概述了Visitor模式的工作原理,尽管他们使用的示例实现是Java。您可以轻松地将其移植到Python,不是吗?

基本上,您想实现一种双重调度机制。AST中的每个节点都需要实现一个accept()方法(不是visit()方法)。该方法将访问者对象作为参数。在此accept()方法的实现中,您调用visit()visitor对象的方法(每种AST节点类型都有一个;在Java中,您将使用参数重载,在Python中,我想可以使用不同的visit_*()方法)。然后,将使用正确的Node类型作为参数调度正确的访问者。



 类似资料:
  • 问题内容: 我想从令牌列表构造一个AST。我正在编写脚本语言,并且已经完成了词法分析部分,但是我不知道如何创建AST。所以问题是,我该如何处理: 并将其转换为抽象语法树?最好是,我想在 没有 ANTLR之类的库的 情况下 这样做,我想自己尝试从头开始。但是,如果这是一项非常复杂的任务,那么我不介意使用库:)谢谢 问题答案: 基本诀窍是要认识到,无论解析如何完成,都是以增量步骤进行的,包括逐一读取令

  • 首先,我从一个限定名和表开始: 然后我用模式映射构建上下文: 然后构建一个SQL字符串来创建表: 从更大的角度来看,我试图编写跨不同方言可移植的SQL,但我必须为其构建的每个环境都使用不同的模式。我试图在Java中抽象一个通用模式,然后可以使用jOOQ根据目标环境进行映射。

  • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。

  • 我想查找对给定变量或给定方法的调用方的引用,就像Eclipse中的“opencallhierarchy”和“(find)references”特性一样(当您右键单击变量或方法时) 现在我已经获得了源代码的抽象语法树。我使用 Eclipse JDT 来获取 AST,它也解析所有类型绑定。 所以我的问题是,是否可以仅使用此抽象语法树来查找变量/方法引用?(我知道一些代码分析库使用字节码来实现这一点。我

  • 对于我正在编写的聊天机器人,我想让它的解析器可定制,这样人们就不需要修改机器人本身来为他们想要的任何类型的聊天消息添加钩子。解析器使用语法。目前,我用一个类似这样的类来处理这个问题: 然后,将从解析器的actions类中循环一个数组。这允许人们为解析器添加他们自己的“规则”,这解决了我的问题,但这是笨拙的,这是重新发明语法!我真正想要的是人们能够为我的解析器写一些类似俚语的东西。虽然可以用于此,但

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。