From 15d3ab5e7871ff459af13089b82bf5f17f731ebd Mon Sep 17 00:00:00 2001 From: Jordan Date: Wed, 16 Nov 2016 14:21:12 -0800 Subject: [PATCH] forgot lexer_fsm --- src/apc/lexer_fsm.rl | 252 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 src/apc/lexer_fsm.rl diff --git a/src/apc/lexer_fsm.rl b/src/apc/lexer_fsm.rl new file mode 100644 index 0000000..0639e06 --- /dev/null +++ b/src/apc/lexer_fsm.rl @@ -0,0 +1,252 @@ +#include +#include +#include +#include + +extern void lexer_pushtok(int, YYSTYPE); +extern int lexer_lexmapfile(int, int); +extern int lexer_lexelemodel(uint8_t*); +extern int lexer_lexsetmodel(uint8_t*); +extern int lexer_lexsetmap(uint8_t*); +extern int lexer_lexelemap(uint8_t*); +extern int lexer_lexsetvlink(uint8_t*); +extern int lexer_lexelevlink(uint8_t*); +extern int lexer_lexsetolink(uint8_t*); +extern int lexer_lexeleolink(uint8_t*); +extern int ipower(int, int); +extern int ttov(uint8_t*, int); +extern uint8_t* ttos(const uint8_t*, int); + +int lexer_lexstring(uint8_t*, int); +int lexer_setstr(uint8_t*, int); + +#define $($)#$ +#define PUSHTOK(TOK,LFUNC,UTYPE) \ + do { \ + printf("PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \ + tok_t = TOK; \ + yylval.UTYPE = LFUNC(ts, p-ts); \ + lexer_pushtok(tok_t, yylval); \ + ++ntok; \ + } while (0); + +%%{ + machine setstr; + + + action lex_setvlink {printf("Returning setvlink filetype for %s\n", str); type = 5; newstrt = lexer_lexsetvlink(str); fbreak;} + action lex_elevlink {printf("Returning elevlink filetype for %s\n", str); type = 6; newstrt = lexer_lexelevlink(str); fbreak;} + action lex_setmodel {printf("Returning setmodel filetype\n"); newstrt = lexer_lexsetmodel(str); type = 1; fbreak;} + action lex_setmap {printf("Returning setmap filetype\n"); newstrt = lexer_lexsetmap(str); type = 2; fbreak;} + action lex_elemodel {printf("Returning elemodel filetype for %s\n", str); newstrt = lexer_lexelemodel(str); type = 3; fbreak;} + action lex_elemap {printf("Returning elemap filetype for %s\n", str); newstrt = lexer_lexelemap(str); type = 4; fbreak;} + action lex_setolink { printf("Returning setolink filetype\n"); type = 8; newstrt = lexer_lexsetolink(str); fbreak;} + action lex_eleolink { printf("Returning eleolink filetype\n"); type = 7; newstrt = lexer_lexeleolink(str); fbreak;} + action p {printf("p = %s \n",p);} + + + SSN = 'SSN'; + SSW = 'SSW'; + SSS = 'SSS'; + SSE = 'SSE'; + SSNW = 'SSNW'; + SSNE = 'SSNE'; + SSSW = 'SSSW'; + SSSE = 'SSSE'; + direction = (SSN | SSW | SSS | SSE | SSNW | SSNE | SSSW | SSSE); + + nm = alpha >p; + name = alpha+; + num = digit+; + refs = digit >p; + ref = refs+; + + + set_label = name | (name '_' ref); + ele_label = (name | name '_' ref); + + set_model = set_label '_' (name | name '_' num '_' num ) [\0] %to(lex_setmodel) ; + set_map = set_label '_' '~' '_' (name | name '_' num '_' num ) [\0] %to(lex_setmap) >p; + ele_model = set_label '_' ele_label '_' direction '_' (name | name '_' num '_' num) [\0] %to(lex_elemodel); + ele_map = set_label '_' ele_label '_' '~' '_' (name | name '_' num '_' num) [\0] %to(lex_elemap); + set_olink = ref %to(lex_setolink) [\0] ; + ele_olink = set_label '_' '~' '_' ref [\0] %to(lex_eleolink); + set_vlink = set_label '_' '#' '_' (ref | ref '_' name) [\0] %to(lex_setvlink); + ele_vlink = set_label '_' ele_label '_' '#' '_' (ref | ref '_' name) [\0] >p %to(lex_elevlink); + + #main := (set_model | set_map | ele_model | ele_map | set_link | ele_link); + + #main := (set_olink | set_vlink | set_model | set_map | ele_map | ele_model | ele_olink | ele_vlink); + main := name; + + + + + write data; + + +}%% + +int +lexer_setstr +(uint8_t* str, int size) +{ uint8_t *p, *pe, *eof; + int cs, type, newstrt; + + type = newstrt = 0; + + p = str; + pe = str + size ; + + printf("Starting fsm filetype with str = %s, p = %s, pe = %s\n", str,p, pe); + + %%write init; + %%write exec noend; + + printf("lexer_setstr is incrementing str by %d, type is %d\n", newstrt, type); + + return newstrt; +} + +%%{ + machine lexstring; + + # set up yylval and tok_t to be pushed to stack + action push_ref { PUSHTOK(REF, ttov, ref); } + action push_val { PUSHTOK(NUM, ttov, val); } + action push_name { printf("pushing NAME token from %s to %s\n", ts, p); PUSHTOK(NAME, ttos, str); } + action push_map { printf("Pushing map file\n"); yylval.str = (uint8_t*) '~'; lexer_pushtok(MOPEN, yylval); ntok++; } + action set_ts { printf("Lexstring: Setting ts (%s) = p(%s)\n", ts, p); ts = p; } + action lex_error { printf("input error: character %c in filename %s is invalid\n p = %s\n", fc, str, p);} + + # Parses a regular filename (not a mapping) and pushes + # tokens to the parser + + ref = '0x'. alnum+ %push_ref; + val = digit+ %push_val; + name = alpha+ %push_name ; + map = '~' %push_map; + tok = (ref | val | name | map); + segment = tok . [_\0] %set_ts; + segment_end = tok; + + tok_lexer := segment+ [\0]; + + write data; + +}%% + +int +lexer_lexstring +(uint8_t* str, int size) +{ uint8_t *p; + uint8_t *ts, *pe, *eof; + int cs, ntok, tok_t; + + ntok = 0; + p = ts = str; + pe = p + size + 1; + + printf("Starting lexstring on str %s.\n",str); + + %%write init; + %%write exec; + + printf("Ending lexstring of file %s, pushed %d tokens.\n",str, ntok); + + return ntok; +} + + +/**************************/ +/****Abandon All Hope******/ +/**************************/ +/*** ***/ +/*** ***/ +/*** ***/ +/*** ***/ + + +/* %%{ */ +/* machine file_matcher; */ + +/* action call_ml { ts = p; fgoto set_hw ;} */ +/* action call_tl { return 0;} */ +/* action set_height {height = ttov(p, p-ts+1); ts = p;} */ +/* action set_width { width = ttov(p, p-ts+1);} */ +/* action call_lmf {lexer_lexmapfile(height, width); } */ +/* action lex_error {printf("input error: character %c in filename %s is invalid\n = %s\n", fc, str, p);} */ + +/* #This machine determines the type of file we are lexing */ +/* #and calls the appropriate machine to handle it. */ + +/* #TODO add mapping name */ +/* width = digit+ %set_width; */ +/* height = digit+ %set_height; */ + +/* set_hw := height . '_' . width [\0] %to(call_lmf); */ + +/* tok_segment = alnum; */ +/* map_end = 'm' . '_' %to(call_ml); */ +/* tok_end = alnum+ . [\0] %to(call_tl); */ + +/* file_matcher := (tok_segment+ . '_' )+ ( map_end | tok_end ); */ + +/* write data; */ +/* }%% */ + +/* int */ +/* lexer_matchfile */ +/* (char* str, int size) */ +/* { *p, *pe; */ +/* char* ts; */ +/* int cs, ntok, height, width; */ + +/* p = str; */ +/* pe = p + size; */ +/* height = width = 0; */ + +/* printf("Checking if filename is a map file:: filename = %s, p = %c, pe = %c\n", str, *p, *pe); */ + +/* %%write init; */ +/* %%write exec noend; */ + +/* printf("Ending lexer_ismapfile on %s\n", str); */ + +/* return ntok; */ +/* } */ + +/* %%{ */ +/* machine vartype; */ + +/* action isele {return 0;} */ +/* action ismodel {return 1;} */ + +/* set_name = alpha+; */ +/* ele_name = alpha+; */ +/* model_name = alpha+; */ + +/* ele = set_name '_' model_name '_' ele_name %isele; */ +/* model = set_name '_' model_name [\0] %ismodel; */ + + +/* ismodel := (ele | model); */ + +/* write data; */ + +/* }%% */ + +/* int */ +/* lexer_ismodel */ +/* (uint8_t* str, int size) */ +/* { uint8_t *p, *pe, *eof; */ +/* int cs; */ + +/* p = str; */ +/* pe = p + size + 1; */ + +/* %%write init; */ +/* %%write exec; */ + + +/* } */ -- 2.18.0