本章介紹開源PSS解析工具:
1.?
?PSSTools語法解析器,這個工具僅包含一個語法解析器。
2.? gen-pss,實現了語法解析器,和簡單的Test realization,沒有約束求解器。
? ? ? ?本文將改造并使用gen-pss來生成C測試用例,改造工具將放在gitee開源網站上。因為gen-pss是使用java實現的一個PSS語法解析器,因此我們需要在系統上安裝java JDK。
系統環境:
- GNU Make 3.82
- OpenJDK Runtime Environment (build 13.0.2+8)
pss-gen目錄構成:
|-- antlr4? ? ? ??//?基于Java開發的開源的語法分析器生成工具
| -- issue? ? ? ? // 問題記錄
| -- samples? ?// 測試用例
| -- src? ? ? ? ? ?// 源代碼
編譯pss-gen:
1.? 切換到pss-gen目錄下,設置PSS_HOME路徑
2. 切換到pss-gen/src目錄,并執行make,編譯生成java包
$ cd pss-gen
$ export PSS_HOME=$PWD
$ cd src && make
java -jar /home/workspace/pss-gen/antlr4/antlr-4.9.3-complete.jar -no-listener -visitor PSS.g4;
javac --release 13 -classpath /home/handongw/workspace/PSS/pss-tool/pss-gen/src:/home/handongw/workspace/PSS/pss-tool/pss-gen/antlr4/antlr-4.9.3-complete.jar PSS*.java
jar cf pssgen_.jar *.class
運行測試用例:
1. 使用PSS語言進行簡單建模
component pss_top {action sub_a {rand int a;rand int b;constraint {a in [100..200];b in [100..200];(a - b) > 12;}exec header C = """
#include "sub_a.h"
""";exec declaration ASM = """int sub_a;""";exec body ASM = """result = {{a}} - {{b}}""";exec run_start ASM = """sub_a.run_start""";exec run_end ASM = """sub_a.run_end""";
};action add_a {rand int a;rand int b;constraint {a in [0..100];b in [0..100];(a + b) > 120;}exec header C = """
#include "add_a.h"
""";exec declaration C = """int add_a;""";exec body C = """result = {{a}} + {{b}}""";exec run_start C = """add_a.run_start""";exec run_end C = """add_a.run_end""";
};action root_a {exec header C = """
#include "root_a.h"
""";exec declaration C = """int root_a;""";exec body C = """root_a.body""";exec run_start C = """root_a.run_start""";exec run_end C = """root_a.run_end""";activity {do sub_a;do add_a;}
};
};
執行make命令生成測試激勵
include ../Make.varsgentarget:$(PSSGEN) test.pss -n 1 -root pss_top::root_a || true
測試激勵
// header#include "root_a.h"#include "sub_a.h"#include "add_a.h"// declaration
int root_a;
int sub_a;
int add_a;void main() {// run_startroot_a.run_startsub_a.run_startadd_a.run_start{// action pss_top.root_a realizationroot_a.body}{// action pss_top.root_a.sub_a realizationresult = 182 - 150}{// action pss_top.root_a.add_a realizationresult = 33 + 93}// run_endroot_a.run_endsub_a.run_endadd_a.run_end}