咨询类C语言编译器扫描器与解析器的常用负面测试用例
编译器扫描器与解析器的常见负面测试用例
一、扫描器(Scanner)负面测试用例
扫描器的负面测试聚焦于无效词法单元,验证扫描器能正确识别并标记不符合语言规范的输入:
1. 非法字符测试
针对语言中未定义的特殊字符(如@、#、$等),确保扫描器将其标记为无效:
TEST_CASE("Scanner: Invalid characters", "[front-end][scanner][negative]") { antlr4::ANTLRInputStream input("@ # $ % ^ & *"); WPLLexer lexer(&input); auto token = lexer.nextToken(); while (token->getType() != antlr4::Token::EOF) { CHECK(token->getType() == antlr4::Token::INVALID_TYPE); token = lexer.nextToken(); } }
2. 无效标识符测试
测试不符合命名规则的标识符(以数字开头、包含非法字符等):
TEST_CASE("Scanner: Invalid identifiers", "[front-end][scanner][negative]") { antlr4::ANTLRInputStream input("123var var@name _invalid-char"); WPLLexer lexer(&input); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); }
3. 无效数值字面量测试
验证格式错误的数字(多小数点、非法十六进制/二进制字符):
TEST_CASE("Scanner: Invalid numeric literals", "[front-end][scanner][negative]") { antlr4::ANTLRInputStream input("123.456.789 0xG 0b2"); WPLLexer lexer(&input); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); CHECK(lexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); }
4. 未闭合的字符串/注释测试
测试未正确闭合的字符串或多行注释:
TEST_CASE("Scanner: Unclosed literals/comments", "[front-end][scanner][negative]") { antlr4::ANTLRInputStream strInput("\"hello world"); WPLLexer strLexer(&strInput); CHECK(strLexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); antlr4::ANTLRInputStream commentInput("/* this is an unclosed comment"); WPLLexer commentLexer(&commentInput); CHECK(commentLexer.nextToken()->getType() == antlr4::Token::INVALID_TYPE); }
二、解析器(Parser)负面测试用例
解析器的负面测试针对语法结构错误,验证解析器能检测并报告不符合语言语法规则的代码:
1. 缺失必要符号测试
测试缺失分号、括号、大括号等核心语法符号的情况:
TEST_CASE("Parser: Missing required symbols", "[front-end][parser][negative]") { antlr4::ANTLRInputStream input1("int x = 5"); WPLLexer lexer1(&input1); antlr4::CommonTokenStream tokens1(&lexer1); WPLParser parser1(&tokens1); parser1.program(); CHECK(parser1.getNumberOfSyntaxErrors() > 0); antlr4::ANTLRInputStream input2("if (x > 0 { x = 1; }"); WPLLexer lexer2(&input2); antlr4::CommonTokenStream tokens2(&lexer2); WPLParser parser2(&tokens2); parser2.program(); CHECK(parser2.getNumberOfSyntaxErrors() > 0); }
2. 语法结构错误测试
验证不符合语言语法逻辑的结构(如else无对应if、break不在循环内):
TEST_CASE("Parser: Invalid syntax structure", "[front-end][parser][negative]") { antlr4::ANTLRInputStream input1("else { x = 0; }"); WPLLexer lexer1(&input1); antlr4::CommonTokenStream tokens1(&lexer1); WPLParser parser1(&tokens1); parser1.program(); CHECK(parser1.getNumberOfSyntaxErrors() > 0); antlr4::ANTLRInputStream input2("int main() { break; }"); WPLLexer lexer2(&input2); antlr4::CommonTokenStream tokens2(&lexer2); WPLParser parser2(&tokens2); parser2.program(); CHECK(parser2.getNumberOfSyntaxErrors() > 0); }
3. 错误的语句/表达式测试
测试语法错误的语句或表达式(如赋值给常量、函数参数数量不匹配):
TEST_CASE("Parser: Invalid statements/expressions", "[front-end][parser][negative]") { antlr4::ANTLRInputStream input1("5 = x;"); WPLLexer lexer1(&input1); antlr4::CommonTokenStream tokens1(&lexer1); WPLParser parser1(&tokens1); parser1.program(); CHECK(parser1.getNumberOfSyntaxErrors() > 0); antlr4::ANTLRInputStream input2("func(1);"); WPLLexer lexer2(&input2); antlr4::CommonTokenStream tokens2(&lexer2); WPLParser parser2(&tokens2); parser2.program(); CHECK(parser2.getNumberOfSyntaxErrors() > 0); }
4. 错误的声明测试
验证变量或函数声明的语法错误(如重复声明、返回类型缺失):
TEST_CASE("Parser: Invalid declarations", "[front-end][parser][negative]") { antlr4::ANTLRInputStream input1("int x; int x;"); WPLLexer lexer1(&input1); antlr4::CommonTokenStream tokens1(&lexer1); WPLParser parser1(&tokens1); parser1.program(); CHECK(parser1.getNumberOfSyntaxErrors() > 0); antlr4::ANTLRInputStream input2("main() { return 0; }"); WPLLexer lexer2(&input2); antlr4::CommonTokenStream tokens2(&lexer2); WPLParser parser2(&tokens2); parser2.program(); CHECK(parser2.getNumberOfSyntaxErrors() > 0); }
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

