1// re2c $INPUT -o $OUTPUT -s 2#include <cstring> 3#include <iostream> 4 5struct Scanner 6{ 7 Scanner(char *txt) 8 : cur(txt), lim(txt + strlen(txt)) 9 { 10 } 11 12 char *cur; 13 char *lim; 14 char *ptr; 15 char *ctx; 16 char *tok; 17}; 18 19#define YYCTYPE char 20#define YYCURSOR s.cur 21#define YYLIMIT s.lim 22#define YYMARKER s.ptr 23#define YYCTXMARKER s.ctx 24#define YYFILL(n) 25 26enum What 27{ 28 UNEXPECTED, 29 KEYWORD, 30 NUMBER, 31 EOI 32}; 33 34char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; 35 36 37int scan(Scanner &s) 38{ 39 YYCTYPE *cursor = s.cur; 40 41 if(cursor == s.lim) 42 return EOI; 43 44std: 45 s.tok = cursor; 46 47/*!re2c 48 49("a"|"b")/[1] { return KEYWORD; } 50("a"|"b")/[0-9]+ { return KEYWORD; } 51[0-9]+ { return NUMBER; } 52 53[ \t\n] 54 { 55 if(s.cur == s.lim) 56 return EOI; 57 cursor = s.cur; 58 goto std; 59 } 60. 61 { 62 return UNEXPECTED; 63 } 64*/ 65} 66 67/*!max:re2c */ 68 69int main(int,char**) 70{ 71 Scanner s("a77 a1 b8 b1"); 72 73 int t, n = 0; 74 while ((t = scan(s)) != EOI) 75 { 76 std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; 77 } 78} 79