如何使ModelRenderer解析为我的班级?

时间:2018-10-28 15:14:17

标签: tatsu

我正在尝试使用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 :(得分:-1)

我遇到了类似的问题,但是使用了代码生成部分。你的语法长什么样?