- char* tok_pattern = "T[%i]L[%i]";
- char* lval_type = tok_pattern + 8; //location of i
- tok_lval[NUM] = 'i';
- tok_lval[STR] = 's';
- tok_lval[SS] = 'i';
- tok_lval[NAME] = 's';
- tok_lval[REF] = 'x';
- tok_lval[SSD] = 'i';
- tok_lval[FPTR] = 'x';
- //lex 10 tokens
- printf(YELLOW);
- for (i = 0; i < 10; i++)
- { if ((tok = lexer()) != 0)
- { *lval_type = tok_lval[tok] ? tok_lval[tok] : '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 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_string = 0;
+ tok_pattern[LOFFS] = 'i';
+ break;
+ case 0:
+ goto done;
+ }
+ if (tok_string == NULL)
+ { tok_pattern[TOFFS] = 'i';