lexer testing complete
[henge/webcc.git] / src / bin / tools / testapc.c
1 /*!@file
2 \brief APC test driver
3 \details This driver does what APC does, but in staggered stages with
4 additional debugging information
5 \author Jordan Lavatai
6 \date Aug 2016
7 ----------------------------------------------------------------------------*/
8 /* Standard */
9 #include <stdio.h> //print
10 #include <errno.h> //errors
11 #include <string.h> //strnlen
12 /* Posix */
13 #include <stdlib.h> //exit
14 #include <unistd.h> //getopt
15 /* Internal */
16 #include <apc/parser.tab.h> //bison
17 #include <apc/ir.h> //ir
18
19 /* Import apc.c but redefine its primary symbols for jumping */
20 #define main apc_main
21 #define yyparse testapc_yyparse
22 #include <bin/tools/apc.c>
23 #undef yyparse
24 #undef main
25
26 int main(int, char*[]);
27 int testapc_yyparse(void);
28
29 extern //bison
30 int yyparse(void);
31 extern //lexer.c
32 int lexer_init(void);
33 extern //apc.c
34 const char* cargs['Z'];
35
36 extern //apc/parser.tab.c
37 YYSTYPE yylval;
38 extern //lexer.c
39 int lexer(void);
40
41 /* Ansi Term Colors */
42 #define RED "\x1b[31m"
43 #define GREEN "\x1b[32m"
44 #define YELLOW "\x1b[33m"
45 #define BLUE "\x1b[34m"
46 #define MAGENTA "\x1b[35m"
47 #define CYAN "\x1b[36m"
48 #define CLRC "\x1b[0m" //clear current color
49
50 /* Main entry from terminal
51 parses debugging options for testing apc, and calls apc_main
52 */
53 int main
54 ( int argc,
55 char* argv[]
56 )
57 { apc_main(argc, argv);
58 printf(GREEN "PASS\n");
59 exit(EXIT_SUCCESS);
60 }
61
62 #define MAX_TOK 1024
63 char tok_lval[MAX_TOK];
64
65 /* yyparse intercept */
66 int testapc_yyparse
67 ()
68 { int i, tok;
69 char* tok_pattern = "T[%i]L[%i]";
70 char* lval_type = tok_pattern + 8; //location of i
71 tok_lval[NUM] = 'i';
72 tok_lval[STR] = 's';
73 tok_lval[SS] = 'i';
74 tok_lval[NAME] = 's';
75 tok_lval[REF] = 'x';
76 tok_lval[SSD] = 'i';
77 tok_lval[FPTR] = 'x';
78 //lex 10 tokens
79 printf(YELLOW);
80 for (i = 0; i < 10; i++)
81 { if ((tok = lexer()) != 0)
82 { *lval_type = tok_lval[tok] ? tok_lval[tok] : 'i';
83 printf(tok_pattern, tok, yylval.val);
84 }
85 else
86 { printf(";");
87 break;
88 }
89 }
90 printf("\n" CLRC);
91 }