X-Git-Url: https://git.kengrimes.com/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Flexer_lex.rl;h=f7eb429b9e705566b32591b4aef0dc572282643f;hp=234e94195de671c972083fe8c16322284feb0457;hb=5204a4831d3ed34270d5fbb260aece8194c859e5;hpb=417d4c623d44eb8477656481aed35e654d3ce33d diff --git a/src/apc/lexer_lex.rl b/src/apc/lexer_lex.rl old mode 100644 new mode 100755 index 234e941..f7eb429 --- a/src/apc/lexer_lex.rl +++ b/src/apc/lexer_lex.rl @@ -1,115 +1,114 @@ -/* Ragel State Machine for tokenizing text */ -#include -#include -#include - -extern void lexer_pushtok(int, YYSTYPE); - -int lexer_lex(const char*); -int ipow(int, int); -int ttov(const char* str, int); -uint64_t ttor(const char* str, int); -char* ttos(const char* str, int); - - -#define MAX_TOK_LEN 64 -#define MAX_TOKENS 16 -#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS) -#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 token_matcher; - - # set up yylval and tok_t to be pushed to stack - action set_ref { PUSHTOK(REF, ttor, ref); } - action set_val { PUSHTOK(NUM, ttov, val); } - action set_name { PUSHTOK(NAME, ttos, str); } - action set_ts { ts = p; } - action lex_error {printf("input error: character %c in filename %s is invalid\n", fc, str);} - - # instantiate machines for each possible token - ref = '0x' xdigit+ %set_ref; - val = digit+ %set_val; - name = alpha+ %set_name; - tok = ref | val | name; - segment = (tok . '_') %set_ts; - - main := segment* . tok $lerr(lex_error); -}%% - - -%%write data; - -/* Scan filename and push the its tokens - onto the stack */ -int lexer_lex (const char* str) -{ - const char *p, *pe, *ts, *eof; - int cs, tok_t, ntok = 0; - printf ("Lexing: %s\n",str); - p = ts = str; - pe = p + strlen(str); - %%write init; - %%write exec; - printf ("Lexed %i tokens\n",ntok); - return ntok; -} - -int ipow(int base, int exp) -{ - int result = 1; - while (exp) - { - if (exp & 1) - result = result * base; - exp = exp >> 1; - base *= base; - } - - return result; -} - -/* Token to Value */ -int ttov(const char* str, int len) -{ - int i, val = 0; - - for (i = 0; i < len; i++) - { - val += ((str[len - (i + 1)] - '0') * ipow(10,i)); - } - - return val; -} - -uint64_t ttor(const char* str, int len) -{ - int i; - uint64_t num = 0; - - for (i = 0; i < len; i++) - { - num += ((str[len - (i + 1)] - '0') * ipow(10,i)); - } - - return num; -} - -char* ttos(const char* str, int len) -{ - int i; - char token_buf[MAX_TOK_LEN]; - - memmove(token_buf, str, len); - token_buf[len+1] = '\0'; - - return strdup(token_buf); -} +/* Ragel State Machine for tokenizing text */ +#include +#include +#include + +extern void lexer_pushtok(int, YYSTYPE); + +int lexer_lex(const char*); +int ipow(int, int); +int ttov(const char* str, int); +uint64_t ttor(const char* str, int); +char* ttos(const char* str, int); + + +#define MAX_TOK_LEN 64 +#define MAX_TOKENS 16 +#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS) +#define $($)#$ +#define PUSHTOK(TOK,LFUNC,UTYPE) \ + do { \ + printf("PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \ + tok_t = TOK; \ + yylval.UTYPE = LFUNC(ts, ts-p-1); \ + lexer_pushtok(tok_t, yylval); \ + ++ntok; \ + } while (0) + +%%{ + machine token_matcher; + + # set up yylval and tok_t to be pushed to stack + action set_ref { PUSHTOK(REF, ttor, ref); } + action set_val { PUSHTOK(NUM, ttov, val); } + action set_name { PUSHTOK(NAME, ttos, str); } + action set_ts { ts = p; } + action lex_error {printf("input error: character %c in filename %s is invalid\n", fc, str);} + + # instantiate machines for each possible token + ref = '0x'. xdigit+ . '_' %set_ref; + val = digit+ . '_' %set_val; + name = alpha+ . '_' %set_name; + tok = (ref | val | name) %set_ts; + + main := alpha+ @set_name; +}%% + + +%%write data; +/* Scan filename and push the its tokens + onto the stack */ +int lexer_lex (const char* str) +{ + const char *p, *pe, *ts, *eof; + int cs, tok_t, ntok = 0; + printf ("Lexing: %s\n",str); + p = ts = str; + pe = p + strlen(str); + printf("p = %s \n", p); + %%write init; + %%write exec; + printf ("Lexed %i tokens\n",ntok); + return ntok; +} + +int ipow(int base, int exp) +{ + int result = 1; + while (exp) + { + if (exp & 1) + result = result * base; + exp = exp >> 1; + base *= base; + } + + return result; +} + +/* Token to Value */ +int ttov(const char* str, int len) +{ + int i, val = 0; + + for (i = 0; i < len; i++) + { + val += ((str[len - (i + 1)] - '0') * ipow(10,i)); + } + + return val; +} + +uint64_t ttor(const char* str, int len) +{ + int i; + uint64_t num = 0; + + for (i = 0; i < len; i++) + { + num += ((str[len - (i + 1)] - '0') * ipow(10,i)); + } + + return num; +} + +char* ttos(const char* str, int len) +{ + int i; + char token_buf[MAX_TOK_LEN]; + + memmove(token_buf, str, len); + token_buf[len+1] = '\0'; + + return strdup(token_buf); +}