我已经使用 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')