Как заставить ModelRenderer разрешить мои занятия?

Я пытаюсь использовать генерацию кода Тацу для создания перевода. Пример программы "calc" правильно работает в моей системе. Когда я запускаю следующий код из примера с добавленной печатью, он печатает следующее:

def parse_and_translate():
    grammar = open('grammars/calc_model.ebnf').read()

    parser = tatsu.compile(grammar, asmodel=True)
    model = parser.parse('3 + 5 * ( 10 - 20 )')
    print(model)

{
  "__class__": "Add",
  "right": {
    "__class__": "Multiply",
    "right": {
      "__class__": "Subtract",
      "right": 20,
      "op": "-",
      "left": 10
    },
    "op": "*",
    "left": 5
  },
  "op": "+",
  "left": 3
}

У меня похожий код

def main():
    parser = tatsu.compile(GRAMMAR, asmodel=True)
    for formula in formulas:
        model = parser.parse(formula)
        code = FormulaCodeGenerator().render(model)
        print(model)

который печатает следующее:

[<tatsu.synth.Response object at 0x000001F28BF2ABA8>, '~', 
<tatsu.synth.Pterm object at 0x000001F28BF0B2E8>]

Похоже, классы ModelRenderer не разрешаются правильно. Не знаю, откуда берутся tatsu.synth.Response и tatsu.synth.Pterm, но в примере calc классы разрешаются. Я определил классы следующим образом:

class FormulaCodeGenerator(CodeGenerator):
    def __init__(self):
        super(FormulaCodeGenerator, self).__init__(modules= . [THIS_MODULE])


class Response(ModelRenderer):
    template = """\
    Response {value}"""


class Pterm(ModelRenderer):
    template = """\
    Pterm {value}"""

Я очень внимательно следовал примеру, но, очевидно, я упускаю что-то важное и надеюсь, что кто-то может указать мне правильное направление.

1 ответ

Я сталкиваюсь с подобной проблемой, но с частью генерации кода. как выглядит ваша грамматика?

Другие вопросы по тегам