/* 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
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;
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
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.
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);