features_lexer.c (6241B)
1 #include "features_lexer.h" 2 #include <kit/support/gram_lex_tables.h> 3 4 enum { 5 C_OTHER, 6 C_WS, 7 C_DIGIT, 8 C_ALPHA, 9 C_UNDERSCORE, 10 C_w, 11 C_h, 12 C_i, 13 C_l, 14 C_e, 15 C_f, 16 C_o, 17 C_r, 18 C_a, 19 C_c, 20 C_COMMA, 21 C_SEMI, 22 C_COUNT 23 }; 24 25 enum { 26 S_START, 27 S_WS, 28 S_NUM, 29 S_ID, 30 S_W, 31 S_WH, 32 S_WHI, 33 S_WHIL, 34 S_WHILE, 35 S_F, 36 S_FO, 37 S_FOR, 38 S_FOR_, 39 S_FOR_E, 40 S_FOR_EA, 41 S_FOR_EAC, 42 S_FOR_EACH, 43 S_COMMA, 44 S_SEMI, 45 S_COUNT 46 }; 47 48 #define D KIT_GRAM_LEX_DEAD 49 #define ROW(other, ws, digit, alpha, under, w, h, i, l, e, f, o, r, a, c, comma, semi) \ 50 other, ws, digit, alpha, under, w, h, i, l, e, f, o, r, a, c, comma, semi 51 52 static const uint16_t g_trans[] = { 53 /* other ws digit alpha under w h i l e f o r a c , ; */ 54 ROW(D, S_WS, S_NUM, S_ID, S_ID, S_W, S_ID, S_ID, S_ID, S_ID, S_F, S_ID, S_ID, S_ID, S_ID, S_COMMA, S_SEMI), 55 ROW(D, S_WS, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D), 56 ROW(D, D, S_NUM, D, D, D, D, D, D, D, D, D, D, D, D, D, D), 57 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 58 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_WH, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 59 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_WHI,S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 60 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_WHIL,S_ID,S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 61 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_WHILE,S_ID,S_ID,S_ID,S_ID,S_ID, D, D), 62 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 63 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_FO, S_ID, S_ID, S_ID, D, D), 64 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_FOR,S_ID, S_ID, D, D), 65 ROW(D, D, S_ID, S_ID, S_FOR_,S_ID,S_ID,S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 66 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_FOR_E,S_ID,S_ID,S_ID,S_ID,S_ID, D, D), 67 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_FOR_EA,S_ID,D, D), 68 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_FOR_EAC,D, D), 69 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_FOR_EACH,S_ID,S_ID,S_ID,S_ID,S_ID,S_ID,S_ID,S_ID,D, D), 70 ROW(D, D, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, S_ID,S_ID, S_ID, S_ID, S_ID, D, D), 71 ROW(D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D), 72 ROW(D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D), 73 }; 74 _Static_assert(sizeof(g_trans) / sizeof(g_trans[0]) == S_COUNT * C_COUNT, 75 "features lexer transition table has wrong dimensions"); 76 77 enum { 78 A_WS, 79 A_WHILE, 80 A_FOR_EACH, 81 A_SEMI, 82 A_NUMBER, 83 A_COMMA, 84 A_IDENT, 85 A_COUNT 86 }; 87 88 static const KitGramLexAccept g_accepts[] = { 89 [A_WS] = { .skip = true }, 90 [A_WHILE] = { .tok = FEATURES_TOK_WHILE }, 91 [A_FOR_EACH] = { .tok = FEATURES_TOK_FOR_EACH }, 92 [A_SEMI] = { .tok = FEATURES_TOK_SEMI }, 93 [A_NUMBER] = { .tok = FEATURES_TOK_NUMBER }, 94 [A_COMMA] = { .tok = FEATURES_TOK_COMMA }, 95 [A_IDENT] = { .tok = FEATURES_TOK_IDENT }, 96 }; 97 _Static_assert(sizeof(g_accepts) / sizeof(g_accepts[0]) == A_COUNT, 98 "features lexer accept table has wrong dimensions"); 99 100 static const uint16_t g_accept[] = { 101 [S_START] = KIT_GRAM_LEX_ACCEPT_NONE, 102 [S_WS] = A_WS, 103 [S_NUM] = A_NUMBER, 104 [S_ID] = A_IDENT, 105 [S_W] = A_IDENT, 106 [S_WH] = A_IDENT, 107 [S_WHI] = A_IDENT, 108 [S_WHIL] = A_IDENT, 109 [S_WHILE] = A_WHILE, 110 [S_F] = A_IDENT, 111 [S_FO] = A_IDENT, 112 [S_FOR] = A_IDENT, 113 [S_FOR_] = A_IDENT, 114 [S_FOR_E] = A_IDENT, 115 [S_FOR_EA] = A_IDENT, 116 [S_FOR_EAC] = A_IDENT, 117 [S_FOR_EACH] = A_FOR_EACH, 118 [S_COMMA] = A_COMMA, 119 [S_SEMI] = A_SEMI, 120 }; 121 122 const KitGramLexGrammar features_lex_grammar = { 123 .name = "features", 124 .class_of = { 125 [' '] = C_WS, ['\t'] = C_WS, ['\r'] = C_WS, ['\n'] = C_WS, 126 ['0'] = C_DIGIT, ['1'] = C_DIGIT, ['2'] = C_DIGIT, ['3'] = C_DIGIT, ['4'] = C_DIGIT, 127 ['5'] = C_DIGIT, ['6'] = C_DIGIT, ['7'] = C_DIGIT, ['8'] = C_DIGIT, ['9'] = C_DIGIT, 128 ['A'] = C_ALPHA, ['B'] = C_ALPHA, ['C'] = C_ALPHA, ['D'] = C_ALPHA, ['E'] = C_ALPHA, 129 ['F'] = C_ALPHA, ['G'] = C_ALPHA, ['H'] = C_ALPHA, ['I'] = C_ALPHA, ['J'] = C_ALPHA, 130 ['K'] = C_ALPHA, ['L'] = C_ALPHA, ['M'] = C_ALPHA, ['N'] = C_ALPHA, ['O'] = C_ALPHA, 131 ['P'] = C_ALPHA, ['Q'] = C_ALPHA, ['R'] = C_ALPHA, ['S'] = C_ALPHA, ['T'] = C_ALPHA, 132 ['U'] = C_ALPHA, ['V'] = C_ALPHA, ['W'] = C_ALPHA, ['X'] = C_ALPHA, ['Y'] = C_ALPHA, 133 ['Z'] = C_ALPHA, 134 ['b'] = C_ALPHA, ['d'] = C_ALPHA, ['g'] = C_ALPHA, ['j'] = C_ALPHA, ['k'] = C_ALPHA, 135 ['m'] = C_ALPHA, ['n'] = C_ALPHA, ['p'] = C_ALPHA, ['q'] = C_ALPHA, ['s'] = C_ALPHA, 136 ['t'] = C_ALPHA, ['u'] = C_ALPHA, ['v'] = C_ALPHA, ['x'] = C_ALPHA, ['y'] = C_ALPHA, 137 ['z'] = C_ALPHA, 138 ['_'] = C_UNDERSCORE, 139 ['w'] = C_w, ['h'] = C_h, ['i'] = C_i, ['l'] = C_l, ['e'] = C_e, 140 ['f'] = C_f, ['o'] = C_o, ['r'] = C_r, ['a'] = C_a, ['c'] = C_c, 141 [','] = C_COMMA, [';'] = C_SEMI, 142 }, 143 .nclasses = C_COUNT, 144 .trans = g_trans, 145 .nstates = S_COUNT, 146 .accept = g_accept, 147 .accepts = g_accepts, 148 .naccepts = A_COUNT, 149 }; 150 151 void features_lexer_init(KitGramLexer *mem, KitGramLexInput *in, const KitGramLexConfig *cfg) { 152 kit_gram_lexer_init(mem, &features_lex_grammar, in, cfg); 153 } 154 155 void features_matcher_init(KitGramMatcher *m) { 156 kit_gram_matcher_bind(m, &features_lex_grammar); 157 } 158 159 void features_string_matcher_init(KitGramMatcher *m) { 160 kit_gram_matcher_bind(m, &features_string_lex_grammar); 161 } 162 163 #undef ROW 164 #undef D