1// re2c $INPUT -o $OUTPUT -s 2#include <stdlib.h> 3#include <stdio.h> 4#include <string.h> 5 6#define RET(n) return n 7 8size_t scan(const char *s, int l, char *r) 9{ 10 const char *p = s; 11 const char *q; 12 #define YYCTYPE char 13 #define YYCURSOR p 14 #define YYLIMIT (s+l) 15 #define YYMARKER q 16 #define YYFILL(n) 17 18 while(1) 19 { 20/*!re2c 21 ALNUM = [0-9a-zA-Z]; 22 ANY = [\001-\377]\"?"; 23 EOF = '\000'; 24 25 "?!" ALNUM* { 26 *r++ = '1'; 27 continue; 28 } 29 30 "?" ALNUM+ { 31 *r++ = '2'; 32 continue; 33 } 34 35 EOF { 36 *r++ = '3'; 37 *r++ = '\0'; 38 return p - s; 39 } 40 41 ANY* { 42 *r++ = '0'; 43 *r++ = '\0'; 44 return p - s; 45 } 46*/ 47 } 48} 49 50void _do_scan(const char * str, size_t str_len, size_t scn_len, const char * exp, size_t exp_len) 51{ 52 char res[32], sp[32]; 53 size_t res_len, inp_len; 54 55 inp_len = scan(str, str_len, res); 56 res_len = strlen(res); 57 58 memset(sp, ' ', sizeof(sp)); 59 sp[15 - str_len] = '\0'; 60 61 printf("[%s](%2d/%2d)%s: %8s(%d) %s %8s(%d)\n", str, inp_len, scn_len, sp, 62 res, res_len, 63 inp_len != scn_len || exp_len != res_len || strncmp(exp, res, exp_len) ? "!=" : "==", 64 exp, exp_len); 65} 66 67#define do_scan(str, scn_len, exp) _do_scan(str, sizeof(str) - 1, scn_len, exp, sizeof(exp) - 1) 68 69main() 70{ 71 do_scan("?1??", 2, "20"); 72 do_scan("#", 1, "0"); 73 do_scan("##", 2, "0"); 74 do_scan("##?", 2, "0"); 75 do_scan("##|", 3, "0"); 76 do_scan("?!|", 3, "10"); 77 do_scan("?!?1|", 5, "120"); 78 do_scan("?!?a+", 5, "120"); 79 do_scan("?2!1?2??", 4, "20"); 80 do_scan("?1?2!1?2??", 6, "220"); 81 do_scan("?1?2?!1?2??", 9, "22120"); 82 do_scan("?1?2?!1?2?!", 12, "221213"); 83 do_scan("?1?123?45??", 9, "2220"); 84 do_scan("?1?123?45?!", 12, "22213"); 85} 86