我使用的是python 3.8.5和lark-parser 0.11.2。我有一个关于访客的问题。
我有一个满足我需要的语法,Lark工作得很好。我有一个例子,在某些情况下,我想要计算返回的解析树,并扫描它以获得树中出现的变量名列表,可能是空的。
示例表达式如下:
count + num_items表达式中的解析树是:
Tree('add', [Tree('variable', [Token('VARIABLE', 'count')]), Tree('variable', [Token('VARIABLE', 'num_items')])])我想我应该编写一个Visitor类来扫描树中的变量,并将它们存储在一个内部列表中:
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。
我可能误用了Visitor类。有没有最好的/更好的方法来解决这个问题?
发布于 2021-03-17 23:29:41
好吧,我正在回答我的问题,但我不确定这就是答案。
我在问题中的代码块中将Visitor更改为Transformer,并正常工作。
我很高兴我有了一个解决方案,但感觉Visitor应该是这里的正确工具。我仍然很高兴发现我在这里是否滥用了lib,以及是否有更好的方法。
https://stackoverflow.com/questions/66675186
复制相似问题