如何让Grammarinator基于openqasm3语法生成有效随机测试程序
核心错误原因
你预设的执行链路存在错误:antlr4py3的作用是根据.g4语法文件生成Python版本的词法/语法解析器代码,无法产出拆分后的qasm3Lexer.g4、qasm3Parser.g4文件,这是你后续所有操作无效的根源。
正确操作流程
1. 拆分合并版qasm3.g4为独立的词法、语法文件
你使用的qasm3.g4是合并了词法规则、语法规则的单文件,Grammarinator要求输入拆分后的两类.g4文件,拆分规则如下:
- 新建
qasm3Lexer.g4,仅保留原文件中所有词法相关规则:包括fragment定义、关键字定义、符号定义、词法匹配规则,文件头声明为lexer grammar qasm3Lexer; - 新建
qasm3Parser.g4,仅保留原文件中所有语法相关规则,文件头增加如下内容:
grammar qasm3Parser; options { tokenVocab=qasm3Lexer; }
2. 生成Grammarinator专属的Unlexer和Unparser文件
执行如下命令:grammarinator-process qasm3Lexer.g4 qasm3Parser.g4 -o ./grammarinator_output
执行完成后,输出目录会生成qasm3LexerUnlexer.py、qasm3ParserUnparser.py两个核心文件。
3. 生成有效OpenQASM3测试用例
执行如下命令,注意替换你需要的生成数量、深度参数:grammarinator-generate -l ./grammarinator_output/qasm3LexerUnlexer.py -p ./grammarinator_output/qasm3ParserUnparser.py -r program -n 100 -d 20 -o ./test_cases/test_%d.qasm
参数说明:
-r program指定生成入口为语法的顶层规则,需和原g4文件中的顶层规则名完全匹配-d 20指定生成语法树的最大深度,取值过小将导致用例不完整,取值过大将增加生成耗时-n 100指定生成100个测试用例,输出路径中的%d会自动替换为用例序号
异常排查方案
- 生成用例存在语法错误:优先检查拆分后的两个.g4文件是否遗漏了规则,原g4中的语义断言、自定义动作默认会被Grammarinator忽略,若需生成符合语义约束的用例,需自行补充Grammarinator生成规则
- 生成过程报规则不存在错误:核对入口规则名拼写、Unlexer/Unparser文件路径是否正确
内容的提问来源于stack exchange,提问作者Ming
相关产品推荐
相关产品推荐

