ragel state machine for lexer/scanner
[henge/webcc.git] / src / apc / lexer.c
index 67aeb23..4d3ab0a 100644 (file)
@@ -30,8 +30,9 @@
 /* Public */
 int  lexer_init(void);
 int  lexer(void);
-int  lexer_lex(const char*);
-void lexer_pushtok(int, int);
+void lexer_pushtok(int, YYSTYPE);
+extern //ragel
+int lexer_lex(const char*);
 struct dirent* lexer_direntpa[DE_STACKSIZE];
 /* Private */
 extern //scanner.c
@@ -44,13 +45,14 @@ extern //bison
 YYSTYPE yylval;
 static
 struct tok
-{ int lval;
-  int tok;
+{ union YYSTYPE val; //token val
+  int tt; //token type
 } token_stack[TK_STACKSIZE];
 static
 union tokp
-{ int*        i;
-  struct tok* t;
+{ int*        tpt; //token pointer type
+  struct tok* tok;
+  union YYSTYPE* tvp; //token value pointer
 } tks, tkx;
 static
 struct dirent** dps;
@@ -76,14 +78,16 @@ struct dirent** dps;
    times in a sequence!
 */
 #define TK_STACK     (token_stack)
-#define TK_STACKP    (tks.t)
-#define TK_STACKPI   (tks.i)
-#define TK_STACKX    (tkx.t)
-#define TK_STACKXI   (tkx.i)
+#define TK_STACKP    (tks.tok)
+#define TK_STACKPI   (tks.tpt)
+#define TK_STACKPL   (tks.tvp)
+#define TK_STACKX    (tkx.tok)
+#define TK_STACKXI   (tkx.tpt)
 #define TK_LEN()     (TK_STACKP - TK_STACKX)
 #define TK_INIT()    (TK_STACKP = TK_STACKX = TK_STACK)
 #define TK_POP()     (*TK_STACKP++)
 #define TK_POPI()    (*TK_STACKPI++);
+#define TK_POPL()    (*TK_STACKPL++);
 #define TK_PUSH(T,L) (*TK_STACKX++ = (struct tok){L,T})
 
 /* Initializer
@@ -114,20 +118,10 @@ int lexer
           return 0;
         }
     }
-  yylval.val = TK_POPI();
+  yylval = TK_POPL();
   return TK_POPI();
 }
 
-/* Lexical Analysis
-   Ragel state machine for tokenizing text.
-*/
-int lexer_lex
-(const char* str)
-{ lexer_pushtok(1, 2);
-  printf (str);
-  return 1;
-}
-
 
 /* Token Receiver
    This receiver takes a struct tok and pushes it to the FIFO stack.
@@ -135,7 +129,7 @@ int lexer_lex
 void lexer_pushtok
 #define S(S)#S //stringifier
 #define ERR_TK "Fatal: Generated over " S(TK_STACKSIZE) " tokens in one pass."
-( int tok, int lval )
+( int tok, YYSTYPE lval )
 { if (TK_LEN() >= TK_STACKSIZE)
     { fprintf(stderr, ERR_TK);
       exit(EXIT_FAILURE);