0

我正在使用 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

我可能滥用了访客类。有没有最好/更好的方法来解决这个问题?

4

1 回答 1

0

好吧,我正在回答我的问题,但我不确定这是不是答案。

我在问题的代码块中更改VisitorTransformer,它只是工作。

我很高兴我有一个解决方案,但感觉Visitor应该是这里的正确工具。仍然很高兴知道我是否在这里滥用了 lib 以及是否有更好的方法。

于 2021-03-17T15:29:41.440 回答