diff options
author | kartofen <mladenovnasko0@gmail.com> | 2025-07-03 19:11:36 +0300 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2025-07-03 19:11:36 +0300 |
commit | f2bef76fb369d4c9c3e53dca60eb78b75bb02d97 (patch) | |
tree | 94de181d7dae1d35310e1e9bfbf761b0fc536adf /parts | |
parent | 5064a7ebce75a26d0405c92040f1a40187fcc7e3 (diff) |
working more or less parser generator (no semantic action, so pretty much useless
Diffstat (limited to 'parts')
-rw-r--r-- | parts/grammar.h | 14 | ||||
-rw-r--r-- | parts/symbol.h | 11 | ||||
-rw-r--r-- | parts/table.h | 7 | ||||
-rw-r--r-- | parts/toklist.h | 4 | ||||
-rw-r--r-- | parts/util-tables.h | 4 |
5 files changed, 28 insertions, 12 deletions
diff --git a/parts/grammar.h b/parts/grammar.h index 328f88e..a02a99e 100644 --- a/parts/grammar.h +++ b/parts/grammar.h @@ -5,9 +5,9 @@ extern struct production { symbol LHS; symbol *RHS; size_t nRHS; -} grammar[]; +} *grammar; -extern const size_t total_productions; +extern size_t total_productions; void grammar_print() { @@ -18,5 +18,15 @@ void grammar_print() printf("\n"); } } +void grammar_print_cstyle() + +{ + for(size_t i = 0; i < total_productions; i++) { + printf("{%d, (symbol[]){", grammar[i].LHS); + for(size_t j = 0; j < grammar[i].nRHS; j++) + printf("%d, ", grammar[i].RHS[j]); + printf("}, %zu},\n", grammar[i].nRHS); + } +} #endif diff --git a/parts/symbol.h b/parts/symbol.h index 5f865ec..2e9c30c 100644 --- a/parts/symbol.h +++ b/parts/symbol.h @@ -5,8 +5,13 @@ typedef unsigned int symbol; extern size_t total_symbols; // extern char *symbol_to_str[] ... -extern int symbol_is_terminal(symbol s); -extern int symbol_is_input_end(symbol s); -extern int symbol_is_valid(symbol s); +extern int (*symbol_is_terminal)(symbol s); +extern int (*symbol_is_input_end)(symbol s); +extern int (*symbol_is_valid)(symbol s); + +// helper macro +#define IMPLEMENT_FUNCPTR(type, name, args, ...) \ + type __##name args __VA_ARGS__ \ + type (*name) args = __##name; #endif diff --git a/parts/table.h b/parts/table.h index 23c61dc..44d1e12 100644 --- a/parts/table.h +++ b/parts/table.h @@ -12,12 +12,13 @@ extern struct action { extern size_t table_states; -extern int table_fill(); -extern void table_free(); +/*extern*/ int table_fill(); +/*extern*/ void table_free(); void table_print(); void table_print_cstyle(); #include "symbol.h" + void table_print() { printf(" "); @@ -40,7 +41,7 @@ void table_print() void table_print_cstyle() { for(size_t i = 0; i < table_states; i++) { - printf("{"); + printf("(struct action[]){"); for(size_t sym = 0; sym < total_symbols; sym++) printf("{%d, %zu},", table[i][sym].type, table[i][sym].arg); printf("},\n"); diff --git a/parts/toklist.h b/parts/toklist.h index 9a7b8ce..a6fe68d 100644 --- a/parts/toklist.h +++ b/parts/toklist.h @@ -3,7 +3,7 @@ #include "symbol.h" -extern symbol toklist_eat(); -extern symbol toklist_peek(); +/*extern*/ symbol toklist_eat(); +/*extern*/ symbol toklist_peek(); #endif diff --git a/parts/util-tables.h b/parts/util-tables.h index 66ecab5..6e173cf 100644 --- a/parts/util-tables.h +++ b/parts/util-tables.h @@ -5,7 +5,7 @@ extern int **follow; extern int **first; -extern void util_tables_fill(); -extern void util_tables_free(); +/*extern*/ void util_tables_fill(); +/*extern*/ void util_tables_free(); #endif |