Python SLY开发自定义语言如何实现仅调用say函数才打印变量
问题原因
现在自动打印的逻辑来自两个设计的叠加:
- Parser中定义了
expr可以直接作为statement,单独一行的变量x会被解析为合法的表达式语句返回 - Execute类的初始化逻辑中,无论执行的是什么类型的语句,只要
walkTree返回非空的数字、字符串、布尔值,就会自动打印结果
解决方案
方案1:仅修改执行逻辑(保留表达式语句语法,不自动打印)
修改NoobpyExecute类的__init__方法,仅当根语句是say类型时才执行打印,其他语句仅执行逻辑不打印返回值:
class NoobpyExecute: def __init__(self, tree, variables): self.variables = variables # 仅say语句需要打印结果 if tree and isinstance(tree, tuple) and tree[0] == 'say': result = self.walkTree(tree) if result is None: pass elif type(result) in [int, float]: print(result) elif isinstance(result, str): print(result) elif isinstance(result, bool): print("true" if result else "false") else: # 其他语句仅执行逻辑,忽略返回值不打印 self.walkTree(tree)
修改后单独写x不会触发打印,只有调用say x时才会打印变量值,同时保留了表达式作为其他语句组成部分的正常逻辑。
方案2:语法层面禁用单独表达式语句(更严格的语法规则)
如果不希望用户可以写单独的表达式作为一行语句,可以直接删除NoobpyParser类中如下的规则定义:
@_('expr') def statement(self, p): return p.expr
删除后用户写单独的x会直接触发语法错误,从根源上避免自动打印的问题,适合想要强语法校验的场景。
内容的提问来源于stack exchange,提问作者Flampt
相关产品推荐
相关产品推荐

