Python Lark 解析器:我安装的任何版本似乎都没有 .pretty() 打印方法

问题描述

问题:

# From example at https://github.com/lark-parser/lark/blob/master/examples/json_parser.py
from lark import Lark,Transformer,v_args
parse = json_parser.parse
json_grammar = r""" ... """
### Create the JSON parser with Lark,using the LALR algorithm
json_parser = Lark(json_grammar,parser='lalr',# Using the standard lexer isn't required,and isn't usually recommended.
                   # But,it's good enough for JSON,and it's slightly faster.
                   lexer='standard',# disabling propagate_positions and placeholders slightly improves speed
                   propagate_positions=False,maybe_placeholders=False,# Using an internal transformer is faster and more memory efficient
                   transformer=TreetoJson())

with open(sys.argv[1]) as f:
    tree = parse(f.read())
    print( tree )
    # Errors next 2 lines:
    # No: tree.pretty( indent_str="  " )
    # No: Lark.pretty( indent_str="  " )

特定错误

设置:

Python 版本 = 3.8.1

在 Mac Bug Sur 上的 Miniconda 3 中

conda install lark-parser

已安装 0.11.2-pyh44b312d_0

conda upgrade lark-parser

已安装 0.11.3-pyhd8ed1ab_0

编辑:注意我的目标:

这里的目标不仅仅是解析 JSON;我只是碰巧使用了一个 JSON 示例来尝试学习。我想为我在工作中处理的一些数据编写自己的语法。

编辑:为什么我相信漂亮的印刷品应该存在:

这是一个使用 .pretty() 函数的示例,甚至包括输出。但我似乎找不到任何包含 .pretty() 的内容(至少通过 conda):http://github.com/lark-parser/lark/blob/master/docs/json_tutorial.md

解决方法

我不确定我可以在这个答案中输入什么,而这个答案中还没有其他答案。我将尝试创建相应的示例:

json_parser = Lark(json_grammar,parser='lalr',# Using the standard lexer isn't required,and isn't usually recommended.
                   # But,it's good enough for JSON,and it's slightly faster.
                   lexer='standard',# Disabling propagate_positions and placeholders slightly improves speed
                   propagate_positions=False,maybe_placeholders=False,# Using an internal transformer is faster and more memory efficient
                   transformer=TreeToJson()
)

这里重要的一行是 transformer=TreeToJson()。它告诉 lark 在将 Tree 返回给您之前应用 Transformer 类 TreeToJson。如果删除该行:

json_parser = Lark(json_grammar,)

然后您使用 Tree 方法获得 .pretty 实例:

tree = json_parser.parse(test_json)
print(tree.pretty())

然后您可以手动应用 Transformer

res = TreeToJson().transform(tree)

这现在是一个“普通”python 对象,就像您从 stdlib json 模块中获得的一样,因此可能是一个 dictonary。

transformer= 构造的 Lark 选项使得这在创建树之前完成,从而节省时间和内存。

,

Lark 示例目录中的 JSON 解析器使用树转换器将解析后的树转换为普通的 JSON 对象。这样就可以通过与 Python 标准库中的 JSON 解析器进行比较来验证解析是否正确:

    j = parse(test_json)
    print(j)
    import json
    assert j == json.loads(test_json)

最后的 assert 只有当 parse 返回的值与 json.loads 返回的对象类型相同时才能通过,dict 是一个普通的未修饰的 Python 内置类型,通常arrayindent

您可能会发现 pretty printer in the Python standard library 对这个特定的应用程序很有用。或者您可以使用带有非零 print(json.dumps(json_value,indent=2)) 关键字参数的内置 JSON.dumps 函数。 (例如:ed