aboutsummaryrefslogtreecommitdiff
path: root/parts
diff options
context:
space:
mode:
authorkartofen <mladenovnasko0@gmail.com>2025-07-03 19:11:36 +0300
committerkartofen <mladenovnasko0@gmail.com>2025-07-03 19:11:36 +0300
commitf2bef76fb369d4c9c3e53dca60eb78b75bb02d97 (patch)
tree94de181d7dae1d35310e1e9bfbf761b0fc536adf /parts
parent5064a7ebce75a26d0405c92040f1a40187fcc7e3 (diff)
working more or less parser generator (no semantic action, so pretty much useless
Diffstat (limited to 'parts')
-rw-r--r--parts/grammar.h14
-rw-r--r--parts/symbol.h11
-rw-r--r--parts/table.h7
-rw-r--r--parts/toklist.h4
-rw-r--r--parts/util-tables.h4
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