0

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>)
user4979733
  • 3,181
  • 4
  • 26
  • 41
  • 1
    My apologies, but YAML output has not been maintained in a long while because it is not used in any of the common TatSu workflows. I think you posted an issue against TatSu at https://github.com/neogeny/TatSu/issues/144. A pull request would be good. – Apalala Nov 24 '19 at 20:12
  • 1
    Thank you for letting me know. Yes, I did file that issue. I will try to see if I can figure out a fix, but I am not sure if I will be successful. We can continue the conversation on the issue thread once I make some progress. – user4979733 Nov 25 '19 at 19:07

1 Answers1

1

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

Apalala
  • 9,017
  • 3
  • 30
  • 48