optimization pass thru parser
authorken <ken@mihrtec.com>
Sun, 18 Dec 2016 23:55:08 +0000 (15:55 -0800)
committerken <ken@mihrtec.com>
Sun, 18 Dec 2016 23:55:08 +0000 (15:55 -0800)
.gitignore
src/apc.c
src/lexer.c
src/lexer_fsm.rl
src/parser.y

index c3f76ab..99c2540 100644 (file)
@@ -6,4 +6,5 @@
 *.o
 *~
 *#*#
+.#*
 parser.output
index a4ae543..cea3847 100644 (file)
--- 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();
index b01b292..362d62b 100644 (file)
@@ -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;
   
index bbbdf30..d8db2b4 100644 (file)
@@ -1,35 +1,44 @@
 #include <stdio.h>
 #include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
 #include "parser.tab.h"
 #include "apc.h"
 #include <unistdio.h>
 #include <unistr.h>
-
-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;
index e47ae97..60a5867 100644 (file)
@@ -4,24 +4,23 @@
 }
 
 %{
-  #include "apc.h"
   #include <stdio.h>
   #include <string.h>
   #include <dirent.h>
-
+  #include <unitypes.h>
   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
 
 %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 <val> HEIGHT
 %token <val> WIDTH
 %token <val> D
-%token <name> NAME
+%token <str> NAME
 //nonterminals
 %type <val> ref_id
  /* Syntax Directed Translation Scheme of the APC grammar */