我正在使用 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')])])
我想我会写一个访问者类,它会扫描树中的变量并将它们存储在一个内部列表中:
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
。
我可能滥用了访客类。有没有最好/更好的方法来解决这个问题?