From: ken Date: Fri, 21 Oct 2016 17:37:06 +0000 (-0700) Subject: testing through yyparse X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=commitdiff_plain;h=b0f2278d15053dfa147c7581927ee57a35bf69cd testing through yyparse --- diff --git a/src/bin/tools/testapc.c b/src/bin/tools/testapc.c index 755cf74..1aca9b3 100644 --- a/src/bin/tools/testapc.c +++ b/src/bin/tools/testapc.c @@ -25,6 +25,7 @@ int main(int, char*[]); int testapc_yyparse(void); +int test_yyparse(void); extern //bison int yyparse(void); @@ -55,19 +56,43 @@ int main char* argv[] ) { apc_main(argc, argv); - printf(GREEN "PASS\n"); + printf(GREEN "PASS" CLRC "\n"); exit(EXIT_SUCCESS); } #define MAX_TOK 1024 char tok_lval[MAX_TOK]; -/* yyparse intercept */ +/* yyparse intercept + tests yyparse internally, then resets the scanner and runs bison's 'yyparse' + implementation after validating it with 'test_yyparse'. +*/ int testapc_yyparse +#ifndef YYABORT +#define YYABORT 1 +#endif +() +{ static char bPassedTest = 'f'; + if (bPassedTest == 'f') + { if (test_yyparse()) + { printf("Parse test aborted\n"); + return YYABORT; + } + bPassedTest = 't'; + apc_main(0,NULL); + } + return yyparse(); +} + +/* test_yyparse + runs 'lexer' 'PASSES' times, or until finished +*/ +int test_yyparse +#define PASSES 1000 () { int i, tok; static char tok_pattern[] = "[" RED " %5i " CLRC "][" CYAN " %-12i " CLRC "]"; - for (i = 0; i < 1000; i++) + for (i = 0; i < PASSES; i++) { switch (tok = lexer()) #define OFFS 27 { case STR: @@ -81,16 +106,36 @@ int testapc_yyparse case NUM: case SS: case SSD: - default: + tok_pattern[OFFS] = 'i'; + break; + case CLOPEN: + case CLCLOSE: + case SOPEN: + case SCLOSE: + case EOPEN: + case ECLOSE: + case VOPEN: + case VCLOSE: + case QOPEN: + case QCLOSE: + case RT: + case HB: tok_pattern[OFFS] = 'i'; break; case 0: - printf(";\n" GREEN "Done" CLRC ".\n"); - return 0; + goto done; + default: + printf(YELLOW "test_yyparse" CLRC ", unknown token [" RED " %5i " CLRC "]",tok); + goto error; } printf(tok_pattern, tok, yylval.val); if (i % 4 == 0 || yylval.val == 1) printf(";\n"); } - printf("\n" CLRC); + done: + printf(";\n" GREEN "Done" CLRC ".\n"); + return 0; + error: + printf(";\n" RED "FAILED" CLRC ".\n"); + return -1; }