1.1测试环境
1.1.1 依赖
由于语法分析程序的输入是词法分析得到的记号序列,因此我们的语法分析单元测试依赖于完备的词法分析,同时,源程序的预处理函数和记号结点的数据类型定义都在main.cpp、main.h中。
故需要合并编译进行测试的源程序:
- lex.l
- yacc.y
- main.cpp
1.1.2 调试输出
如果定义了宏YYDEBUG,那么就可以输出语法分析程序的调试输出,即按顺序输出处理相应记号时的符号栈和状态栈信息以及移进/归约动作。
见main.h:
对应main.cpp中的main函数:#define YYDEBUG 1
这里的调试信息能够很好兼容我们定义的错误处理机制,足够胜任之后的测试评估工作。yydebug=1;
1.1.3 获取可执行文件
Windows端的脚本
flex lex.l //编译lex.l,生成lex.yy.c
ren lex.yy.c lex.yy.cpp //将lex.yy.c更名为lex.yy.cpp
bison -vd --debug yacc.y //编译yacc.y,生成yacc.tab.h和yacc.tab.c
ren yacc.tab.c yacc.tab.cpp //将yacc.tab.c更名为yacc.cpp
g++ lex.yy.cpp yacc.tab.cpp main.cpp -o pascal2c.exe
//编译生成可执行文件pascal2c.exe
Mac端的脚本
flex lex.l mv lex.yy.c lex.yy.cpp bison -v -d --debug yacc.y mv yacc.tab.c yacc.tab.cpp g++ -o test yacc.tab.cpp lex.yy.cpp main.cpp
1.1.4 输入文件
1.1.5 输出文件
1.2测试计划
白盒测试每个产生式的错误情况。(语法分析的DEBUG信息较冗长,为了方便阅读,本版本为全黑盒版本)
- 组合单个产生式的错误为多个错误进行黑盒测试,即另语法分析树有多处错误子树,观察语法分析程序能否成功报告错误信息并回复。
以一个较复杂的,没有错误的程序作为最终黑盒测试。
第一部分
- 测试programstruct
- 测试program_head
- 测试const_declarations
- 测试const_declaration
- 测试var_declarations
- 测试var_declaration
- 第二部分
- 测试type
- 测试period
- 测试subprogram_declarations
- 测试subprogram_head
- 测试formal_parameter
- 测试parameter_list
- 第三部分
- 测试var_paramter
- 测试value_parameter
- 测试compound_statement
- 测试statement_list
- 测试statement
- 测试id_varpart
- 第四部分
- 测试procedure_call
- 测试expression_list
- 测试simple_expression
- 测试term
- 测试Factor
- 最终黑盒测试