首页 > 解决方案 > 无法从 Lark AST 获取值

问题描述

我不能也不知道如何检索我使用 Lark 解析器生成的 AST 的值。

我的语法如下,保存在 .lark 文件中:

start: (un_handle ": ")? AMOUNT "|" p_handle ("," p_handle)* (" \"" MESSAGE* "\"")?

AMOUNT: /[0-9]+(\.[0-9][0-9]?)?/

un_handle: HANDLE

p_handle: HANDLE

HANDLE : /[A-Z][A-Z]/

MESSAGE : /[^"]+/

然后我运行:

testText = '10|GP "Bananas"'
testTree = parser.parse(testText)

并得到:

Tree(start, [Token(AMOUNT, '10'), Tree(p_handle, [Token(HANDLE, 'GP')]), Token(MESSAGE, 'Bananas')])

但是,现在呢?

我意识到我可能必须构建一个转换器,但是我应该定义哪些方法以及我应该如何称呼它们?我只想将 AMOUNT、un_handle、p_handle(可能有多个 p_handle)和 message 的值提取到 Python 变量中。

非常感谢您!已经调试了几个小时。

标签: python-3.7lark-parser

解决方案


首先,尝试添加“线”规则以提供参考点。是的,您的应用程序可能不会使用多行,但通常最好包含一个以防万一。

现在,编写一个子程序来查找 AST 中的每个“行”标记,并将其附加到一个列表中。

最后,我建议您使用基于LisPyeval()中的子例程的子例程来处理结果列表。


推荐阅读