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

咨询类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:30:48