问题描述
我使用的是 python 3.8.5 和 lark-parser 0.11.2。我有一个关于访客的问题。
我有一个语法可以满足我的需求,而且 Lark 工作得很好。我有一个案例, 在某些情况下,我想评估返回的解析树并将其扫描到 获取出现在树中的变量名称列表(可能为空)。
示例表达式为:
count + num_items
表达式的解析树是:
Tree('add',[Tree('variable',[Token('VARIABLE','count')]),Tree('variable','num_items')])])
我想我会写一个访问者类来扫描树中的变量并将它们存储在一个内部列表中:
from lark import Visitor,v_args
@v_args(inline=True)
class FindVariables(Visitor):
def __init__(self):
super().__init__()
self.variable_list = []
def variable(self,var):
try:
self.variable_list.append(var)
except Exception as e:
raise
我正在尝试将其用作:
fv = FindVariables()
fv2 = fv.visit(parse_result)
for var in fv.variable_list:
...
我遇到的问题是,当执行 fv = FindVariables()
时,我得到一个
TypeError
异常:
f() missing 1 required positional argument: 'self'
如果我将上面的调用更改为:
fv = FindVariables().visit(parse_result)
语句运行但 fv
没有“看到”variable_list
。
我可能误用了访问者类。有没有最好/更好的方法来解决这个问题?
解决方法
好吧,我正在回答我的问题,但我不确定这是答案。
我在问题的代码块中将 extra_hosts
更改为 Visitor
并且它起作用了。
我很高兴我有一个解决方案,但感觉就像 Transformer
应该是正确的工具。仍然很高兴知道我是否在这里滥用了 lib 以及是否有更好的方法。