Как заставить ModelRenderer разрешить мои занятия? - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь использовать генерацию кода tatsu для создания перевода.Пример программы «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 Ответ

0 голосов
/ 15 ноября 2018

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

...