1.1测试环境

1.1.1 依赖

由于语法分析程序的输入是词法分析得到的记号序列,因此我们的语法分析单元测试依赖于完备的词法分析,同时,源程序的预处理函数和记号结点的数据类型定义都在main.cpp、main.h中。
故需要合并编译进行测试的源程序:

  • lex.l
  • yacc.y
  • main.cpp

    1.1.2 调试输出

    如果定义了宏YYDEBUG,那么就可以输出语法分析程序的调试输出,即按顺序输出处理相应记号时的符号栈和状态栈信息以及移进/归约动作。
    见main.h:
    1. #define YYDEBUG 1
    对应main.cpp中的main函数:
    1. yydebug=1;
    这里的调试信息能够很好兼容我们定义的错误处理机制,足够胜任之后的测试评估工作。

    1.1.3 获取可执行文件

  • Windows端的脚本

    1. flex lex.l //编译lex.l,生成lex.yy.c
    2. ren lex.yy.c lex.yy.cpp //将lex.yy.c更名为lex.yy.cpp
    3. bison -vd --debug yacc.y //编译yacc.y,生成yacc.tab.h和yacc.tab.c
    4. ren yacc.tab.c yacc.tab.cpp //将yacc.tab.c更名为yacc.cpp
    5. g++ lex.yy.cpp yacc.tab.cpp main.cpp -o pascal2c.exe
    6. //编译生成可执行文件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 输入文件

    PascalProgram.pas

    1.1.5 输出文件

    preProcessed.pas

    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
    • 最终黑盒测试