X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Flexer.rl;h=ff2fa144030048677fc53b985315e3b48def596f;hp=da397c03451968bd4559719b8b406a11f12d1bff;hb=ee18200a9d3817728d6d09745cd29900649d4508;hpb=c2cc9f98349ba7d582fb2e997e99741840e625b0 diff --git a/src/lexer.rl b/src/lexer.rl index da397c0..ff2fa14 100644 --- a/src/lexer.rl +++ b/src/lexer.rl @@ -2,10 +2,10 @@ #include #include #include +#include #include "parser.tab.h" #include "apc.h" -#include -#include +#include "print.h" /* Public */ int lexer_init(void); void lexer_quit(void); @@ -22,13 +22,25 @@ static YYSTYPE lval_stack[0xFF + 1]; static uint8_t lval_offs; +#define $($)#$ #define PUSHTOK(T,L) yypush_parse(pstate, T, (L), cstate) -#define LEXTOK(T,Y,L) do { \ - lval_stack[lval_offs].Y = L; \ - PUSHTOK(T,lval_stack + lval_offs); \ - lval_offs++; \ - ntok++; \ - } while (0); +#define LEXTOK(T,Y,L) do { \ + if (DEBUG) { \ + ulc_fprintf(stdout, "["$(T)); \ + switch (T) { \ + case NAME: case PATH: \ + ulc_fprintf(stdout, "->%U", L); break; \ + case REF: \ + ulc_fprintf(stdout, "->%X", L); break; \ + default: break; \ + } \ + ulc_fprintf(stdout, "]"); \ + } \ + lval_stack[lval_offs].Y = L; \ + PUSHTOK(T,lval_stack + lval_offs); \ + lval_offs++; \ + ntok++; \ + } while (0) #define PUSHFACE(F) LEXTOK(FACING, face, F) #define PUSHREF(R) LEXTOK(REF, ref, R) #define PUSHLINK() LEXTOK(LINK, val, 0) @@ -37,8 +49,6 @@ uint8_t lval_offs; #define PUSHOP(O) LEXTOK(O, val, 0) #define PUSHPATH(P) LEXTOK(PATH, str, P) -#define DEBUG 1 - /* Lexstring is the main lexer for APC and is generated by ragel. It lexes file names of files that have been scanned and pushes their types and values into the tok_stack, which yyparse eventually calls during parsing. */ @@ -50,7 +60,7 @@ uint8_t lval_offs; action push_ref { errno = 0; lval.ref = strtoll((char*)ts,NULL,16); if (errno) - { fprintf(stderr, "Invalid hex number in file %s\n",(char*)str); + { ulc_fprintf(stderr, "Invalid hex number in file %U\n",str); exit(1); } PUSHREF(lval.ref); @@ -59,51 +69,27 @@ uint8_t lval_offs; action push_val { errno = 0; lval.val = strtoll((char*)ts,NULL,10); if (errno) - { fprintf(stderr, "strtoll could not parse %s\n", (char*)str); + { ulc_fprintf(stderr, "strtoll could not parse %U\n",str); exit(1); } PUSHNUM(lval.val); } - action push_name { if(DEBUG) printf("Lexer_lexstring:: action:push_name: from %s to %s\n", ts, p); - PUSHNAME(ts); - } - action push_map { if(DEBUG) printf("Lexer_lexstring:: action:push_map: pushing map token\n"); - PUSHOP(MAP); - } - action set_ts { if(DEBUG) printf("Lexer_lexstring:: action:set_ts. ts = %s\n", p); - ts = p; } - action push_SS { if(DEBUG) printf("Lexer_lexstring:: action:push_SS. p = %s\n",p); - PUSHOP(SS); - } - action push_S { if(DEBUG) printf("Lexer_lexstring:: action:push_S. p = %s\n", p); - PUSHFACE(SFACE); - } - action push_SW { if(DEBUG) printf("Lexer_lexstring:: action:push_SW. p = %s\n", p); - PUSHFACE(SWFACE); - } - action push_W { if(DEBUG) printf("Lexer_lexstring:: action:push_W. p = %s\n", p); - PUSHFACE(WFACE); - } - action push_NW { if(DEBUG) printf("Lexer_lexstring:: action:push_NW. p = %s\n", p); - PUSHFACE(NWFACE); - } - action push_N { if(DEBUG) printf("Lexer_lexstring:: action:push_N. p = %s\n", p); - PUSHFACE(NFACE); - } - action push_NE { if(DEBUG) printf("Lexer_lexstring:: action:push_NE. p = %s\n", p); - PUSHFACE(NEFACE); - } - action push_E { if(DEBUG) printf("Lexer_lexstring:: action:push_N. p = %s\n", p); - PUSHFACE(EFACE); - } - action push_SE { if(DEBUG) printf("Lexer_lexstring:: action:push_N. p = %s\n", p); - PUSHFACE(SEFACE); - } - action ref_error { if(DEBUG) printf("ref from %s to %s has an inappropriate amount of hex digits, it must have eight.\n", ts, p); + action push_name { PUSHNAME(ts); } + action push_map { PUSHOP(MAP); } + action set_ts { ts = p; } + action push_SS { PUSHOP(SS); } + action push_S { PUSHFACE(SFACE); } + action push_SW { PUSHFACE(SWFACE); } + action push_W { PUSHFACE(WFACE); } + action push_NW { PUSHFACE(NWFACE); } + action push_N { PUSHFACE(NFACE); } + action push_NE { PUSHFACE(NEFACE); } + action push_E { PUSHFACE(EFACE); } + action push_SE { PUSHFACE(SEFACE); } + action ref_error { ulc_fprintf(stderr, "ref from %U to %U has an inappropriate amount of hex digits, it must have eight.\n", ts, p); exit(1); } - action p { if(DEBUG) printf("Lexer_lexstring:: p = %s\n", p); - } + action p { dprintf("Lexer_lexstring:: p = %U\n", p); } N = 'N' %push_N; W = 'W' %push_W; @@ -127,7 +113,7 @@ uint8_t lval_offs; tok = (name | val | ref | dimensions | map | link | SS | direction); - main := (tok tok_delimiter)* tok [\0]; + main := (tok tok_delimiter)* tok ; write data nofinal noerror noprefix; @@ -139,6 +125,7 @@ int lexer_init cstate = yycstate_new(); lval_offs = 0; return !pstate || !cstate; + return en_main == 1; } void lexer_quit @@ -151,22 +138,14 @@ int lexer_lexstring ( uint8_t* str, int size ) -{ uint8_t *p; - uint8_t *ts, *pe, *eof; +{ uint8_t* p, * ts, * pe, * eof; int cs, ntok; YYSTYPE lval; - ntok = 0; p = ts = str; - pe = eof = p + size + 1; - - if(DEBUG) printf("|---Begin lexstring on p = %s, pe = %s.\n",p, pe); - + pe = eof = p + size; %%write init; %%write exec; - - if(DEBUG) printf("Ending lexstring of file %s, pushed %d tokens.\n",str, ntok); - return ntok; } @@ -191,33 +170,36 @@ int lexer_lexfile // Mark the end of the filename filename_end = iter; // Lex from either the last period, if present, or filename end + dprintf("%U\n\t",filename); ntok = (last_period) ? lexer_lexstring(filename, (int)(last_period - filename)) : lexer_lexstring(filename, (int)(iter - filename)); + // Replace nulls with their original '_' for (iter = filename; iter < filename_end; iter++) if (*iter == '\0') *iter = '_'; PUSHPATH(filename); + dprintf("\n\t[%i Token%s]\n", ntok, (ntok > 1) ? "s" : ""); return ntok + 1; - return en_main == 1; } int lexer_lexdir ( uint8_t* dirname ) -{ uint8_t* de = dirname; - int ntok; +{ int ntok; ntok = 0; - de = dirname; - if (*de) while (*++de); - ntok = lexer_lexstring(dirname, (int)(de - dirname)); + if (DEBUG) putchar('\t'); + PUSHNAME(dirname); PUSHOP(CLOPEN); + if (DEBUG) putchar('\n'); return ntok; } int lexer_closedir ( void ) { int ntok = 0; + if (DEBUG) putchar('\t'); PUSHOP(CLCLOSE); + if (DEBUG) putchar('\n'); return ntok; }