0

在成功解析后,我有一个由 TatSu 生成的对象模型。模型使用 JSON 格式转储到标准输出 OK。但是当我尝试将其转储到 YAML 时,我得到了一个 RepresenterError 异常。我不知道如何解决这个问题。对象模型由 TatSu 内部生成。任何人都可以阐明如何潜在地解决此错误吗?

将 python 3.7.0 与 TatSu v4.4.0 与 pyyaml 5.1.2 一起使用。

我的代码:

import sys
import json
import datetime
import tatsu

from tatsu.ast import asjson
from tatsu.objectmodel import Node
from tatsu.semantics import ModelBuilderSemantics
from tatsu.exceptions import FailedParse

class ModelBase(Node):
    pass

class MyModelBuilderSemantics(ModelBuilderSemantics):
    def __init__(self, context=None, types=None):
        types = [
            t for t in globals().values()
            if type(t) is type and issubclass(t, ModelBase)
        ] + (types or [])
        super(MyModelBuilderSemantics, self).__init__(context=context, types=types)

def main():

    sys.setrecursionlimit(10000)
    grammar = open('STIL1999.ebnf.working').read()
    parser = tatsu.compile(grammar, semantics=MyModelBuilderSemantics(), asmodel=True)
    assert (parser is not None)

    try:
        start = datetime.datetime.now()
        ast = parser.parse(open(sys.argv[1]).read(), filename=sys.argv[1])
        finish = datetime.datetime.now()
        print('Total = %s' % (finish - start).total_seconds())

        print(json.dumps(asjson(ast), indent=2))
    except FailedParse as e:
        print('Parse error : %s' % e.message)
        print(e.buf.line_info(e.pos))
        return 1

    from tatsu.yaml import ast_dump
    ast_dump(ast, stream=open('foo.yaml', 'w'))

    return 0

if __name__ == '__main__':
    sys.exit(main())

输出:

Total = 0.007043
{
  "__class__": "StilSession",
  "version": {
    "ver": 1.0
  },
  "header": {
    "__class__": "Header",
    "objs": [
      {
        "k": "Title",
        "v": "foo.gz"
      },
      {
        "k": "Date",
        "v": "Mon Nov  4 02:48:48 2019"
      },
      {
        "k": "Source",
        "v": "foo.gz"
      },
      {
        "k": "History",
        "objs": [
          {
            "__class__": "Annotation",
            "ann": " This is a test "
          }
        ]
      }
    ]
  },
  "blocks": []
}
Traceback (most recent call last):
  File "./run.py", line 57, in <module>
    sys.exit(main())
  File "./run.py", line 52, in main
    ast_dump(ast, stream=open('foo.yaml', 'w'))
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/tatsu/yaml.py", line 50, i
n ast_dump
    return dump(data, object_pairs_hook=AST, **kwargs)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/tatsu/yaml.py", line 33, i
n dump
    **kwds
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/__init__.py", line 29
0, in dump
    return dump_all([data], stream, Dumper=Dumper, **kwds)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/__init__.py", line 27
8, in dump_all
    dumper.represent(data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 27, in represent
    node = self.represent_data(data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 58, in represent_data
    node = self.yaml_representers[None](self, data)
  File "/sw_tools/anaconda3/lib/python3.7/site-packages/yaml/representer.py", line
 231, in represent_undefined
    raise RepresenterError("cannot represent an object", data)
yaml.representer.RepresenterError: ('cannot represent an object', <tatsu.synth.StilSession object at 0x7ffff6
8e8f98>)
4

1 回答 1

1

TatSu pull request #146中的 OP 已解决此问题

于 2019-12-25T14:49:07.210 回答