user4979733
user4979733

Reputation: 3411

TatSu: yaml.representer.RepresenterError when dumping to YAML

I have a object model generated by TatSu after doing a successful parse. The model dumps to stdout using JSON format OK. But when I try to dump it to YAML, I get a RepresenterError exception. I am not sure how to solve this. The object model is generated internally by TatSu. Can anyone shed any light on how to potentially resolve this error?

Using python 3.7.0 with TatSu v4.4.0 with pyyaml 5.1.2.

My code:

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())

The output:

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>)

Upvotes: 0

Views: 510

Answers (1)

Apalala
Apalala

Reputation: 9244

This issue was resolved by the OP in TatSu pull request #146

Upvotes: 1

Related Questions