问题描述
我有一个 Python 语法和一个文本框,用户可以在其中编写简单的 Python 表达式,例如这个:
(lambda x: str(x))(wanted_input)
然后用wanted_input 注入表达式(通过使用在我们执行python expr 时创建的人工上下文)。
我很感兴趣是否可以使用解析树侦听器来提取wanted_input,它们基本上是未定义的全局变量。
解决方法
是的,这是可能的。
我相信只有三种类型的表达式可以引入新的变量名称:lambdas、列表推导式和生成器推导式。因此,在您的侦听器或访问者中,您需要在输入这三种类型的表达式时将新引入的变量添加到当前作用域,然后在退出时再次删除它们(确保处理变量被隐藏的情况 - 某种堆栈通常是这里选择的工具)。然后当你看到一个变量时,你只需检查它是否在当前作用域中定义。如果不是,它就是您要提取的变量之一。