Я пытаюсь использовать генерацию кода 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}"""
Я очень внимательно следовал примеру, но, очевидно, я упускаю что-то важное и надеюсь, что кто-то может указать мне правильное направление.