int main(int, char*[]);
int testapc_yyparse(void);
+int test_yyparse(void);
extern //bison
int yyparse(void);
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++)
+ static char* tok_string;
+ static char tok_pattern[] = "[" RED " %9s " CLRC "][" CYAN " %-12i " CLRC "]";
+ for (i = 0; i < PASSES; i++)
{ switch (tok = lexer())
- #define OFFS 27
- { case STR:
- case NAME:
- tok_pattern[OFFS] = 's';
- break;
- case REF:
- case FPTR:
- tok_pattern[OFFS] = 'x';
- break;
- case NUM:
- case SS:
- case SSD:
+ #define TOFFS 9
+ #define LOFFS 27
+ #define $($)#$
+ #define TOK_CASE(T,C) \
+ case T: \
+ tok_string = $(T); \
+ tok_pattern[LOFFS] = C; \
+ break
+ { TOK_CASE(STR,'s');
+ TOK_CASE(NAME,'s');
+ TOK_CASE(REF,'x');
+ TOK_CASE(FPTR,'x');
+ TOK_CASE(NUM,'i');
+ TOK_CASE(SS,'i');
+ TOK_CASE(SSD,'i');
+ TOK_CASE(CLOPEN,'i');
+ TOK_CASE(CLCLOSE,'i');
default:
- tok_pattern[OFFS] = 'i';
+ tok_string = 0;
+ tok_pattern[LOFFS] = 'i';
break;
case 0:
- printf(";\n" GREEN "Done" CLRC ".\n");
- return 0;
+ goto done;
+ }
+ if (tok_string == NULL)
+ { tok_pattern[TOFFS] = 'i';
+ printf(tok_pattern, tok, yylval.val);
+ }
+ else
+ { tok_pattern[TOFFS] = 's';
+ printf(tok_pattern, tok_string, yylval.val);
}
- printf(tok_pattern, tok, yylval.val);
- if (i % 4 == 0 || yylval.val == 1)
+ if (i % 4 == 0 || yylval.val == 0)
printf(";\n");
}
- printf("\n" CLRC);
+ done:
+ printf(";\n" GREEN "Done" CLRC ".\n");
+ return 0;
+ error:
+ printf(";\n" RED "FAILED" CLRC ".\n");
+ return -1;
}