From a67266ff72280b85fed7ec498967a855a5735639 Mon Sep 17 00:00:00 2001 From: kartofen Date: Tue, 1 Jul 2025 00:11:29 +0300 Subject: major refactor, more modular (wow because obviously modularity is always a good thing yes), and etc --- parts/grammar.h | 22 ++++++++++++++++++++++ parts/symbol.h | 12 ++++++++++++ parts/table.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ parts/toklist.h | 9 +++++++++ parts/util-tables.h | 8 ++++++++ 5 files changed, 101 insertions(+) create mode 100644 parts/grammar.h create mode 100644 parts/symbol.h create mode 100644 parts/table.h create mode 100644 parts/toklist.h create mode 100644 parts/util-tables.h (limited to 'parts') diff --git a/parts/grammar.h b/parts/grammar.h new file mode 100644 index 0000000..328f88e --- /dev/null +++ b/parts/grammar.h @@ -0,0 +1,22 @@ +#ifndef GRAMMAR_H +#define GRAMMAR_H + +extern struct production { + symbol LHS; + symbol *RHS; + size_t nRHS; +} grammar[]; + +extern const size_t total_productions; + +void grammar_print() +{ + for(size_t i = 0; i < total_productions; i++) { + printf("%d --> ", grammar[i].LHS); + for(size_t j = 0; j < grammar[i].nRHS; j++) + printf("%d ", grammar[i].RHS[j]); + printf("\n"); + } +} + +#endif diff --git a/parts/symbol.h b/parts/symbol.h new file mode 100644 index 0000000..d3cb5cd --- /dev/null +++ b/parts/symbol.h @@ -0,0 +1,12 @@ +#ifndef SYMBOL_H +#define SYMBOL_H + +typedef unsigned int symbol; +extern const 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); + +#endif diff --git a/parts/table.h b/parts/table.h new file mode 100644 index 0000000..3b54312 --- /dev/null +++ b/parts/table.h @@ -0,0 +1,50 @@ +#ifndef TABLE_H +#define TABLE_H + +extern struct action { + enum action_type { + ACTION_NOT_SET = 0, ACTION_SHIFT, + ACTION_GOTO, ACTION_REDUCE, + ACTION_ACCEPT + } type; + size_t arg; +} *table[]; + +extern size_t table_states; + +extern int table_fill(); +extern void table_free(); +void table_print(); +void table_print_cstyle(); + +#include "symbol.h" +void table_print() +{ + printf(" "); + for(size_t sym = 0; sym < total_symbols; sym++) printf("%2zu ", sym); + printf("\n"); + + char action_to_char[] = {[ACTION_SHIFT] = 's', [ACTION_REDUCE] = 'r', [ACTION_GOTO] = 'g'}; + for(size_t i = 0; i < table_states; i++) { + printf("%2zu ", i); + for(size_t sym = 0; sym < total_symbols; sym++) + if(table[i][sym].type == ACTION_ACCEPT) printf(" a "); + else if(table[i][sym].type) printf("%c%-2zu ", action_to_char[table[i][sym].type], table[i][sym].arg); + else printf(" "); + printf("\n"); + } + + +} + +void table_print_cstyle() +{ + for(size_t i = 0; i < table_states; i++) { + printf("{"); + for(size_t sym = 0; sym < total_symbols; sym++) + printf("{%d, %zu},", table[i][sym].type, table[i][sym].arg); + printf("},\n"); + } +} + +#endif diff --git a/parts/toklist.h b/parts/toklist.h new file mode 100644 index 0000000..b6fd10d --- /dev/null +++ b/parts/toklist.h @@ -0,0 +1,9 @@ +#ifndef TOKLIST_H +#define TOKLIST_H + +#include "symbol.h" + +extern symbol toklist_eat(); +extern symbol toklist_peek(); + +#endif diff --git a/parts/util-tables.h b/parts/util-tables.h new file mode 100644 index 0000000..a6d788a --- /dev/null +++ b/parts/util-tables.h @@ -0,0 +1,8 @@ +#ifndef UTIL_TABLES_H +#define UTIL_TABLES_H + +// extern int *nullable +extern int **follow; +extern int **first; + +#endif -- cgit v1.2.3