lexer test driver
[henge/webcc.git] / src / bin / tools / testscanner.c
1 /*!@file
2 \brief IR Driver
3 \details This is a testing driver for the IR system of APC.
4 \author Jordan Lavatai
5 \date Aug 2016
6 ----------------------------------------------------------------------------*/
7 /* Standard */
8 #include <stdio.h> //print
9 #include <stdlib.h>
10 #include <errno.h> //lib errors
11 /* Internal */
12 #include <apc/parser.tab.h>
13
14 extern //scanner.c
15 int scanner(void);
16 extern //scanner.c
17 int scanner_init(void);
18 extern //scanner.c
19 void scanner_quit(void);
20 extern //parser.tab.h
21 YYSTYPE yylval;
22 extern //lexer.c
23 int lexer(void);
24 extern //lexer.c
25 int lexer_init(void);
26
27 /* Ansi Term Colors */
28 #define RED "\x1b[31m"
29 #define GREEN "\x1b[32m"
30 #define YELLOW "\x1b[33m"
31 #define BLUE "\x1b[34m"
32 #define MAGENTA "\x1b[35m"
33 #define CYAN "\x1b[36m"
34 #define CLRC "\x1b[0m" //clear current color
35
36 int main(void);
37 int test_init(void);
38 int test_scan(void);
39 int test_lex(void);
40
41 const char* cargs['Z'] = {0};
42
43 int main
44 #define $($)#$
45 #define PRINTFAIL(U) printf(RED $(U) " FAILED\n" CLRC)
46 #define PRINTPASS(U) printf(GREEN $(U) " PASSED\n" CLRC)
47 #define PRINTINFO(S) printf(YELLOW S CLRC)
48 #define RUN_UNIT(U,T) \
49 do { \
50 PRINTINFO(T); \
51 if (U()) \
52 PRINTFAIL(U); \
53 else \
54 PRINTPASS(U); \
55 } while (0)
56 ()
57 { cargs['d'] = "../../src";
58 RUN_UNIT(test_scan,"Scanning\n");
59 return 0;
60 }
61
62 int test_scan
63 ()
64 { static int scanned_total = 0;
65 static int n = 0;
66 int scanned, lexed;
67 int i;
68 if (lexer_init())
69 { perror("LIB:");
70 return -1;
71 }
72 loop:
73 if ((lexed = test_lex()) == 0)
74 { printf("No tokens to parse\n");
75 return 0;
76 }
77 else
78 { printf("Parsed %i Token%c\n", lexed, lexed > 1 ? 's' : ' ');
79 goto loop;
80 }
81 return 0;
82 }
83
84 int test_lex
85 ()
86 { int tok_val, n = 0;
87 while ((tok_val = lexer()) || yylval.val)
88 { if (++n % 9 == 0)
89 printf("\n");
90 printf("[T:%4i|Y:%4i]",tok_val,yylval.val);
91 yylval.val = 0;
92 }
93 printf(";\n");
94 return n;
95 }