tok_t = REF; \
yylval.ref = ttor(ts, p-ts); \
lexer_pushtok(tok_t, yylval); \
- ts = p; }
+ num_tokens++; }
action set_val { tok_t = NUM; \
yylval.val = ttov(ts, p-ts); \
lexer_pushtok(tok_t, yylval); \
- ts = p; }
+ num_tokens++; }
action set_name { tok_t = NAME; \
yylval.str = ttos(ts, p-ts); \
lexer_pushtok(tok_t, yylval); \
- ts = p; }
+ num_tokens++; }
+
+ action set_ts { ts = p; }
# 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 := (tok . '_')* . tok;
+ main := segment* . tok;
}%%
%%write data;
-/* 0xxdigit+ => tok_t REF, yylval.ref = uint64_t
- [0-9]+ => tok_t NUM, yylval.val = int
- [a-zA-Z]+ => tok_t NAME, yylval.str = char* */
-
/* 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 ; //tok_t == token type
+ int cs, tok_t, num_tokens; //tok_t == token type
+
+ num_tokens = 0;
p = ts = str;
pe = p + strlen(str) + 1;
%%write init;
%%write exec;
- lexer_pushtok(tok_t, yylval);
printf (str);
- return 1;
+ return num_tokens;
}
int ipow(int base, int exp)