Mon, 01 Sep 2025 00:14:59 +0800
Initial Lexer/Parser
| 0 | 1 | %locations |
| 2 | %define parse.error verbose | |
| 3 | ||
| 4 | %{ | |
| 5 | #include "tlvast.h" | |
| 6 | #include "tlvc.yy.h" | |
| 7 | extern void yyerror(const char *s); | |
| 8 | int field_index = 0; | |
| 9 | %} | |
| 10 | ||
| 11 | %union { | |
| 12 | int num; | |
| 13 | char *str; | |
| 14 | struct tlv_field *field; | |
| 15 | struct tlv_field_list_head *field_list; | |
| 16 | struct tlv *msg; | |
| 17 | } | |
| 18 | ||
| 19 | %token <str> IDENT | |
| 20 | %token <num> TYPE | |
| 21 | %token <num> NUMBER | |
| 22 | %token MESSAGE | |
| 23 | ||
| 24 | %type <msg> message | |
| 25 | %type <field> field | |
| 26 | %type <field_list> field_list | |
| 27 | ||
| 28 | %% | |
| 29 | ||
| 30 | input: | |
| 31 | /* empty */ | |
| 32 | | input message { | |
| 33 | TAILQ_INSERT_TAIL(&g_tlvs, $2, entries); | |
| 34 | } | |
| 35 | ; | |
| 36 | ||
| 37 | message: | |
| 38 | MESSAGE IDENT NUMBER '{' field_list '}' { | |
| 39 | struct tlv *m = malloc(sizeof(*m)); | |
| 40 | m->name = strdup($2); | |
| 41 | m->tag = $3; | |
| 42 | TAILQ_INIT(&m->fields); | |
| 43 | ||
| 44 | struct tlv_field *f; | |
| 45 | TAILQ_FOREACH(f, $5, entries) { | |
| 46 | TAILQ_INSERT_TAIL(&m->fields, f, entries); | |
| 47 | } | |
| 48 | ||
| 49 | $$ = m; | |
| 50 | } | |
| 51 | ; | |
| 52 | ||
| 53 | field_list: | |
| 54 | /* empty */ { | |
| 55 | $$ = NULL; | |
| 56 | } | |
| 57 | | field_list field { | |
| 58 | if ($1 == NULL) { | |
| 59 | struct tlv_field_list_head *list = malloc(sizeof(*list)); | |
| 60 | TAILQ_INIT(list); | |
| 61 | TAILQ_INSERT_TAIL(list, $2, entries); | |
| 62 | $$ = list; | |
| 63 | } else { | |
| 64 | TAILQ_INSERT_TAIL($1, $2, entries); | |
| 65 | $$ = $1; | |
| 66 | } | |
| 67 | field_index = 0; | |
| 68 | } | |
| 69 | ; | |
| 70 | ||
| 71 | field: | |
| 72 | TYPE IDENT ';' { | |
| 73 | struct tlv_field *f = malloc(sizeof(*f)); | |
| 74 | f->type = $1; | |
| 75 | f->name = strdup($2); | |
| 76 | f->tag = field_index++; | |
| 77 | $$ = f; | |
| 78 | } | |
| 79 | ; | |
| 80 | ||
| 81 | %% |