kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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