2

我已经使用 Lark 构建了语法树

Tree(if, [Tree(condition, [Token(VARIABLE, 'x'), Token(ACTION_OPERATOR, '>'), Token(SIGNED_NUMBER, '18')]), Tree(result, [Tree(if, [Tree(condition, [Token(VARIABLE, 'y'), Token(ACTION_OPERATOR, '>'), Token(SIGNED_NUMBER, '500000')]), Tree(result, [Token(STRING, 'switch_credit_type')]), Tree(condition, [Token(VARIABLE, 'y'), Token(ACTION_OPERATOR, '<'), Token(SIGNED_NUMBER, '50000')]), Tree(result, [Tree(if, [Tree(condition, [Token(VARIABLE, 'z'), Token(ACTION_OPERATOR, '>'), Token(SIGNED_NUMBER, '2')]), Tree(result, [Token(STRING, 'success')]), Tree(condition, [Token(VARIABLE, 'z'), Token(ACTION_OPERATOR, '<'), Token(SIGNED_NUMBER, '1')]), Tree(result, [Tree(if, [Tree(condition, [Token(VARIABLE, 'a'), Token(ACTION_OPERATOR, '>'), Token(VARIABLE, 'y')]), Tree(result, [Token(STRING, 'refused')]), Tree(else, [Token(STRING, 'get_more_info')])])]), Tree(else, [Token(STRING, 'get_more_info')])])]), Tree(else, [Token(STRING, 'fail')])])])])

我需要从中生成python代码(条件)但我有缩进问题并尝试自动构建代码生成器

code = []
add_indent = ''

def py_cond_gen(t, level=0):
    global code, add_indent
    if t.data == 'if':
        code.append('if')
        for i, child in enumerate(t.children):
            if child.data == 'condition':
                if code[-1] != 'if':
                    code.append('elif')
                condition_expr = ' '.join([str(children) for children in child.children]) + ':\n\t' + add_indent
                code.append(condition_expr)
            if child.data == 'result':
                if type(child.children[0]).__name__ == 'Tree' and child.children[0].data == 'if':
                    add_indent = '\t' * (level+1)
                    py_cond_gen(child.children[0], level=level+1)
                    add_indent = add_indent[:level-2]
                else:
                    code.append("print('%s')" % child.children[0] + '\n' + add_indent[:level-2])
            if child.data == 'else':
                code.append('else:\n\t' + add_indent[:level-2])
                code.append("print('%s')" % child.children[0] + '\n' + add_indent[:level-2])

但是有额外的缩进,我不知道如何解决这个问题。但我明白了

if x > 10:
    if y > 500000:
        print('switch_credit_type')
    elif y < 50000:
        if z > 2:
            print('success')
        elif z < 1:
            if a > y:
                print('refused')
            else:
                print('get_more_info')
        else:
            print('get_more_info')
    else:
        print('fail')

反而

if x > 10:
    if y > 500000:
        print('switch_credit_type')
    elif y < 50000:
        if z > 2:
            print('success')
        elif z < 1:
            if a > y:
                print('refused')
            else:
                print('get_more_info')
    else:
        print('get_more_info')
else:
    print('fail')
4

0 回答 0