From d47bdba72dd5fef398bc485067fdc59147303253 Mon Sep 17 00:00:00 2001 From: ken Date: Sun, 18 Dec 2016 15:55:08 -0800 Subject: [PATCH] optimization pass thru parser --- .gitignore | 1 + src/apc.c | 8 ++++--- src/lexer.c | 13 +++++++---- src/lexer_fsm.rl | 61 +++++++++++++++++++++++++++--------------------- src/parser.y | 24 +++++++++---------- 5 files changed, 59 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index c3f76ab..99c2540 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ *.o *~ *#*# +.#* parser.output diff --git a/src/apc.c b/src/apc.c index a4ae543..cea3847 100644 --- a/src/apc.c +++ b/src/apc.c @@ -28,7 +28,9 @@ int main(int, char*[]); extern //bison int yyparse(void); extern //lexer.c -int lexer_init(void); +int lexer_init(void); +extern //ir.c +int ir_init(void); extern //apc/parser.tab.c YYSTYPE yylval; @@ -74,8 +76,8 @@ int main printf(USAGE_LONG); exit(EXIT_SUCCESS); } - if (lexer_init()) - { perror("lexer"); + if (lexer_init() || ir_init()) + { perror("init"); exit(EXIT_FAILURE); } yyparse(); diff --git a/src/lexer.c b/src/lexer.c index b01b292..362d62b 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -113,7 +113,6 @@ int lexer_init printing is skipped. In all other cases, 'yylval' is set, and the token's integer representation is returned. */ -int lexer #define $($)#$ #define SCAN_ERROR -1 #define TK_EMPTY (TK_STACKP == TK_STACKX) @@ -122,6 +121,7 @@ int lexer fprintf(stderr,__VA_ARGS__); \ goto done; \ } while (0) +int lexer () { struct tok token; start: @@ -153,10 +153,12 @@ int lexer /* Token Receiver This receiver takes a struct tok and pushes it to the FIFO stack. */ -void lexer_pushtok #define $($)#$ //stringifier #define ERR_TK "Fatal: Generated over " $(TK_STACKSIZE) " tokens in one pass." -( int tok, YYSTYPE lval ) +void lexer_pushtok +( int tok, + YYSTYPE lval +) { if (TK_LEN() >= TK_STACKSIZE) { fprintf(stderr, ERR_TK); exit(EXIT_FAILURE); @@ -167,8 +169,8 @@ void lexer_pushtok /* Lexical analysis of a file Strips a filename to its base name, then sends it to lexer_lex */ -int lexer_lexfile #define HIDDEN_WARNING "%s is hidden and will not be parsed!\n", filename +int lexer_lexfile ( const uint8_t *filename ) { static uint8_t fname[FNAME_MAX]; @@ -207,7 +209,8 @@ uint8_t const* lexer_get_current_filepath /* Scan filename and push the its tokens onto the stack */ int lexer_lexfilename -(uint8_t* str) +( uint8_t* str +) { int ntok, len; uint8_t *filepath; diff --git a/src/lexer_fsm.rl b/src/lexer_fsm.rl index bbbdf30..d8db2b4 100644 --- a/src/lexer_fsm.rl +++ b/src/lexer_fsm.rl @@ -1,35 +1,44 @@ #include #include +#include +#include #include "parser.tab.h" #include "apc.h" #include #include - -extern void lexer_pushtok(int, YYSTYPE); -extern int lexer_lexmapfile(int, int); -extern int ipower(int, int); -extern int ttov(uint8_t*, int); - +extern //lexer.c +void lexer_pushtok(int, YYSTYPE); +/* Public */ int lexer_setdirection(uint8_t*, int); int lexer_lexstring(uint8_t*, int); int lexer_setstr(uint8_t*, int); -#define $($)#$ -#define PUSHTOK(TOK,LFUNC,UTYPE) \ - do { \ - printf("Lexer_lexstring:: PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \ - tok_t = TOK; \ - yylval.UTYPE = LFUNC(ts, p-ts); \ - lexer_pushtok(tok_t, yylval); \ - ++ntok; \ - } while (0); - %%{ 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_ref { te = NULL; errno = 0; + yylval.ref = strtoll((char*)ts,(char**)&te,16); + if (errno | (te != NULL)) + { fprintf(stderr, "Invalid hex number in file %s\n",(char*)str); + if (te != NULL) + { while (str++ < te) + fputc(' ', stderr); + fputc('^', stderr); + } + exit(1); + } + lexer_pushtok(REF, yylval); ntok++; + } + action push_link { lexer_pushtok(LINK,(YYSTYPE)0); ntok++; } + action push_val { te = NULL; errno = 0; + yylval.val = strtoll((char*)ts,(char**)&te,10); + if (errno) + { fprintf(stderr, "strtoll could not parse %s\n", (char*)str); + exit(1); + } + lexer_pushtok(NUM, yylval); + } action push_name { printf("Lexer_lexstring:: action:push_name: from %s to %s\n", ts, p); lexer_pushtok(NAME, yylval); ntok++; @@ -78,12 +87,9 @@ int lexer_setstr(uint8_t*, int); lexer_pushtok(D, yylval); } action push_height { printf("Lexer_lexstring:: action:push_height p = %s\n", p); - PUSHTOK(HEIGHT, ttov, val); } action push_width { printf("Lexer_lexstring:: action:push_height p = %s\n", p); - PUSHTOK(WIDTH, ttov, val); } - action push_link {yylval.str = (uint8_t*) '#'; lexer_pushtok(LINK,yylval); } #action lex_error { printf("input error: character %c in filename %s is invalid\n p = %s\n", fc, str, p);} action p { printf("Lexer_lexstring:: p = %s\n", p);} @@ -102,7 +108,7 @@ int lexer_setstr(uint8_t*, int); #types of tokes a filename can contain direction = (N | W | S | E | NW | NE | SW | SE) ; #make sure 0x123123 doesnt get mistaken for a ref - dimensions = (digit+ - '0') >set_ts %push_height 'x' (digit+ - '0') >set_ts %push_width; + dimensions = (digit+ - '0') >set_ts %push_val 'x' (digit+ - '0') >set_ts %push_val; link = '#' %push_link; SS = ('+SS' %to(push_SS)) | ('+SS' %to(push_SS) link ) ; ref = '0x' >set_ts alnum+ %push_ref; @@ -118,12 +124,13 @@ int lexer_setstr(uint8_t*, int); }%% -int -lexer_lexstring -(uint8_t* str, int size) +int lexer_lexstring +( uint8_t* str, + int size +) { uint8_t *p; - uint8_t *ts, *pe; - int cs, ntok, tok_t; + uint8_t *ts, *pe, *te; + int cs, ntok;//, tok_t; ntok = 0; p = ts = str; diff --git a/src/parser.y b/src/parser.y index e47ae97..60a5867 100644 --- a/src/parser.y +++ b/src/parser.y @@ -4,24 +4,23 @@ } %{ - #include "apc.h" #include #include #include - + #include extern int lexer_init(); //? extern int lexer(); //? extern void pop_cdat(void); - extern void push_cdat(struct name*); + extern void push_cdat(uint8_t*); extern void insert_vdat(void); extern void insert_refid(int); - extern void insert_set_name(struct name*); - extern void insert_set_namelist(struct name*); - extern void insert_link_name(struct name*); - extern void insert_map(struct name*,int, int, int, int, uint8_t*); - extern void insert_mlink(struct name*, int); - extern void insert_vlink(struct name*, int); - extern void insert_framesheet(struct name* ,int, int, int,int, uint8_t*); + extern void insert_set_name(uint8_t*); + extern void insert_set_namelist(uint8_t*); + extern void insert_link_name(uint8_t*); + extern void insert_map(uint8_t*,int, int, int, int, uint8_t*); + extern void insert_mlink(uint8_t*, int); + extern void insert_vlink(uint8_t*, int); + extern void insert_framesheet(uint8_t* ,int, int, int,int, uint8_t*); #define yylex lexer @@ -32,10 +31,9 @@ %define lr.type ielr %union { - int ref; + long long ref; int val; uint8_t* str; - struct name* name; void *voidp; } @@ -56,7 +54,7 @@ %token HEIGHT %token WIDTH %token D -%token NAME +%token NAME //nonterminals %type ref_id /* Syntax Directed Translation Scheme of the APC grammar */ -- 2.18.0