我正在尝试使用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}"""
我已经非常仔细地遵循了这个示例,但是很明显,我缺少了一些重要的东西,希望有人可以指出正确的方向。
答案 0 :(得分:-1)
我遇到了类似的问题,但是使用了代码生成部分。你的语法长什么样?