You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python TatSu中生成随机语法扩展,为解释器生成单元测试用例

关于TatSu是否支持随机生成语法测试用例的解答

截至目前的TatSu官方发行版本中,没有内置(包括未公开的隐藏)随机语法推导生成能力,也没有未被文档收录的对应接口。

不过你可以基于TatSu公开的语法模型API,快速自行实现轻量化的自定义用例生成逻辑,完全可以满足指定规则生成、随机选择产生式的需求,核心实现思路如下:

  • 先用TatSu.compile()编译你的.ebnf语法文件,得到语法模型对象,该对象会完整导出所有规则的产生式结构、终结符定义
  • 针对你指定的目标生成规则,递归遍历对应产生式即可:
    • 多选分支按你预设的权重随机选一个展开
    • 可选节点随机决定是否生成
    • 终结符如果是正则类型,搭配rstr这类正则随机生成库输出符合要求的字符串
    • 给递归规则设置最大展开深度,避免无限生成过长用例

以下是可直接运行的极简实现示例:

import tatsu
import random
import rstr

# 替换为你自己的语法文件路径
with open("my_grammar.ebnf", "r", encoding="utf-8") as f:
    grammar_content = f.read()
grammar_model = tatsu.compile(grammar_content)

def generate_case(rule_name: str, max_depth: int = 5) -> str:
    if max_depth <= 0:
        return ""
    # 从语法模型中取指定规则的定义
    target_rule = grammar_model.grammar.rules[rule_name]
    # 随机选一个产生式分支
    selected_alt = random.choice(target_rule.alternatives)
    result = []
    for expr in selected_alt:
        # 规则引用则递归生成
        if isinstance(expr, tatsu.ast.RuleRef):
            result.append(generate_case(expr.name, max_depth - 1))
        # 终结符直接生成
        elif isinstance(expr, tatsu.ast.Token):
            if expr.regex:
                result.append(rstr.xeger(expr.value))
            else:
                result.append(expr.value)
    return "".join(result)

# 示例:生成名为"expression"的规则对应的测试用例
test_case = generate_case("expression", max_depth=4)
print(test_case)

如果需要更适合单元测试的用例能力,可以把上述逻辑和hypothesis测试库的生成策略结合,还能自动生成边界用例、支持失败用例收缩,能大幅提升测试效率。

内容的提问来源于stack exchange,提问作者bookofproofs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:18:03