From 291b6caa753c191b79a7d88ca8c9130bc9dbd7e1 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Sun, 5 Feb 2023 13:38:59 -0800 Subject: [PATCH] Generate definitions.h; swons --- implementations/C/KEYWORDS.txt | 2 + implementations/C/Makefile | 4 + implementations/C/convert_defs.py | 83 +++++++++++--------- implementations/C/definitions.c | 98 +++++++++++++++++++++++ implementations/C/definitions.h | 27 +++++++ implementations/C/joy.c | 2 + implementations/C/joy.h | 21 ----- implementations/C/keywords.c | 124 +++++++++++++++--------------- 8 files changed, 243 insertions(+), 118 deletions(-) create mode 100644 implementations/C/definitions.c create mode 100644 implementations/C/definitions.h diff --git a/implementations/C/KEYWORDS.txt b/implementations/C/KEYWORDS.txt index 9b0a43c..cafe101 100644 --- a/implementations/C/KEYWORDS.txt +++ b/implementations/C/KEYWORDS.txt @@ -3,6 +3,7 @@ %struct-type %{ #include "joy.h" +#include "definitions.h" %} struct dict_entry; %% @@ -24,6 +25,7 @@ pop, pop stack, stack swaack, swaack swap, swap +swons, def_swons abs, def_abs anamorphism, def_anamorphism app1, def_app1 diff --git a/implementations/C/Makefile b/implementations/C/Makefile index 9cd8e75..ccdf10b 100644 --- a/implementations/C/Makefile +++ b/implementations/C/Makefile @@ -20,6 +20,10 @@ joy.o: joy.h definitions.c: defs.txt convert_defs.py python convert_defs.py > definitions.c +definitions.h: defs.txt convert_defs.py + python convert_defs.py --header > definitions.h + +definitions.o: definitions.h # Gperf doesn't add anything to '{""}' unused entries in the wordlist. # This causes "warning: missing field 'func' initializer [-Wmissing-field-initializers]" diff --git a/implementations/C/convert_defs.py b/implementations/C/convert_defs.py index e0ac15b..beb7478 100644 --- a/implementations/C/convert_defs.py +++ b/implementations/C/convert_defs.py @@ -47,53 +47,64 @@ infra swons swaack [i] dip swaack'''.splitlines() ## ##print() ##print() -##for line in defs: -## name, body = line.split(None, 1) -## print(f'void def_{name}(JoyListPtr stack, JoyListPtr expression);') -print(f''' +print(f'''\ /* -Auto-generated file by {sys.argv[0]} -*/ - -#include "joy.h" - - -/* -Declare a bunch of list pointers to eventually hold the body expressions -of the definitions. +Auto-generated file by {' '.join(sys.argv)} +Do not edit. */ ''') -for line in defs: - name, body = line.split(None, 1) - print(f'JoyList def_{name}_body;') + + +if sys.argv[-1] == '--header': + for line in defs: + name, body = line.split(None, 1) + print(f'void def_{name}(JoyListPtr stack, JoyListPtr expression);') + + +else: + + print(''' + #include "joy.h" + #include "definitions.h" + + + /* + Declare a bunch of list pointers to eventually hold the body expressions + of the definitions. + */ + ''') + for line in defs: + name, body = line.split(None, 1) + print(f'JoyList def_{name}_body;') -print(''' + print(''' -/* -Next, we want an initializer function to fill out the body pointers. -*/ + /* + Next, we want an initializer function to fill out the body pointers. + */ -void -init_defs(void) -{ -''') -for line in defs: - name, body = line.split(None, 1) - print(f'\tdef_{name}_body = text_to_expression("{body}");') -print('}') + void + init_defs(void) + { + ''') + for line in defs: + name, body = line.split(None, 1) + print(f'\tdef_{name}_body = text_to_expression("{body}");') + print('}') -print(''' + print(''' + + /* + Last, a set of functions to go in the wordlist, one for each definition. + */ + ''') + for line in defs: + name, body = line.split(None, 1) + print(f'void def_{name}(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) {{ push_quote_onto_expression(def_{name}_body, expression); }}') -/* -Last, a set of functions to go in the wordlist, one for each definition. -*/ -''') -for line in defs: - name, body = line.split(None, 1) - print(f'void def_{name}(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) {{ push_quote_onto_expression(def_{name}_body, expression); }}') diff --git a/implementations/C/definitions.c b/implementations/C/definitions.c new file mode 100644 index 0000000..7f45943 --- /dev/null +++ b/implementations/C/definitions.c @@ -0,0 +1,98 @@ +/* +Auto-generated file by convert_defs.py +Do not edit. +*/ + + + #include "joy.h" + #include "definitions.h" + + + /* + Declare a bunch of list pointers to eventually hold the body expressions + of the definitions. + */ + +JoyList def_abs_body; +JoyList def_anamorphism_body; +JoyList def_app1_body; +JoyList def_app2_body; +JoyList def_app3_body; +JoyList def_appN_body; +JoyList def_at_body; +JoyList def_average_body; +JoyList def_b_body; +JoyList def_binary_body; +JoyList def_ccccons_body; +JoyList def_ccons_body; +JoyList def_cleave_body; +JoyList def_clop_body; +JoyList def_cmp_body; +JoyList def_codi_body; +JoyList def_codireco_body; +JoyList def_dinfrirst_body; +JoyList def_dipd_body; +JoyList def_disenstacken_body; +JoyList def_swons_body; +JoyList def_infra_body; + + + /* + Next, we want an initializer function to fill out the body pointers. + */ + + void + init_defs(void) + { + + def_abs_body = text_to_expression("dup 0 < [] [neg] branch"); + def_anamorphism_body = text_to_expression("[pop []] swap [dip swons] genrec"); + def_app1_body = text_to_expression("grba infrst"); + def_app2_body = text_to_expression("[grba swap grba swap] dip [infrst] cons ii"); + def_app3_body = text_to_expression("3 appN"); + def_appN_body = text_to_expression("[grabN] codi map reverse disenstacken"); + def_at_body = text_to_expression("drop first"); + def_average_body = text_to_expression("[sum] [size] cleave /"); + def_b_body = text_to_expression("[i] dip i"); + def_binary_body = text_to_expression("unary popd"); + def_ccccons_body = text_to_expression("ccons ccons"); + def_ccons_body = text_to_expression("cons cons"); + def_cleave_body = text_to_expression("fork popdd"); + def_clop_body = text_to_expression("cleave popdd"); + def_cmp_body = text_to_expression("[[>] swap] dipd [ifte] ccons [=] swons ifte"); + def_codi_body = text_to_expression("cons dip"); + def_codireco_body = text_to_expression("codi reco"); + def_dinfrirst_body = text_to_expression("dip infrst"); + def_dipd_body = text_to_expression("[dip] codi"); + def_disenstacken_body = text_to_expression("? [uncons ?] loop pop"); + def_swons_body = text_to_expression("swap cons"); + def_infra_body = text_to_expression("swons swaack [i] dip swaack"); +} + + + /* + Last, a set of functions to go in the wordlist, one for each definition. + */ + +void def_abs(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_abs_body, expression); } +void def_anamorphism(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_anamorphism_body, expression); } +void def_app1(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_app1_body, expression); } +void def_app2(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_app2_body, expression); } +void def_app3(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_app3_body, expression); } +void def_appN(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_appN_body, expression); } +void def_at(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_at_body, expression); } +void def_average(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_average_body, expression); } +void def_b(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_b_body, expression); } +void def_binary(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_binary_body, expression); } +void def_ccccons(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_ccccons_body, expression); } +void def_ccons(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_ccons_body, expression); } +void def_cleave(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_cleave_body, expression); } +void def_clop(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_clop_body, expression); } +void def_cmp(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_cmp_body, expression); } +void def_codi(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_codi_body, expression); } +void def_codireco(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_codireco_body, expression); } +void def_dinfrirst(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_dinfrirst_body, expression); } +void def_dipd(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_dipd_body, expression); } +void def_disenstacken(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_disenstacken_body, expression); } +void def_swons(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_swons_body, expression); } +void def_infra(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_infra_body, expression); } diff --git a/implementations/C/definitions.h b/implementations/C/definitions.h new file mode 100644 index 0000000..083524e --- /dev/null +++ b/implementations/C/definitions.h @@ -0,0 +1,27 @@ +/* +Auto-generated file by convert_defs.py --header +Do not edit. +*/ + +void def_abs(JoyListPtr stack, JoyListPtr expression); +void def_anamorphism(JoyListPtr stack, JoyListPtr expression); +void def_app1(JoyListPtr stack, JoyListPtr expression); +void def_app2(JoyListPtr stack, JoyListPtr expression); +void def_app3(JoyListPtr stack, JoyListPtr expression); +void def_appN(JoyListPtr stack, JoyListPtr expression); +void def_at(JoyListPtr stack, JoyListPtr expression); +void def_average(JoyListPtr stack, JoyListPtr expression); +void def_b(JoyListPtr stack, JoyListPtr expression); +void def_binary(JoyListPtr stack, JoyListPtr expression); +void def_ccccons(JoyListPtr stack, JoyListPtr expression); +void def_ccons(JoyListPtr stack, JoyListPtr expression); +void def_cleave(JoyListPtr stack, JoyListPtr expression); +void def_clop(JoyListPtr stack, JoyListPtr expression); +void def_cmp(JoyListPtr stack, JoyListPtr expression); +void def_codi(JoyListPtr stack, JoyListPtr expression); +void def_codireco(JoyListPtr stack, JoyListPtr expression); +void def_dinfrirst(JoyListPtr stack, JoyListPtr expression); +void def_dipd(JoyListPtr stack, JoyListPtr expression); +void def_disenstacken(JoyListPtr stack, JoyListPtr expression); +void def_swons(JoyListPtr stack, JoyListPtr expression); +void def_infra(JoyListPtr stack, JoyListPtr expression); diff --git a/implementations/C/joy.c b/implementations/C/joy.c index 2cb229c..4f03639 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -34,6 +34,8 @@ along with Thun. If not see . #include #include "joy.h" +#include "definitions.h" + const char *BLANKS = " \t"; diff --git a/implementations/C/joy.h b/implementations/C/joy.h index 68fcb02..b6abc0d 100644 --- a/implementations/C/joy.h +++ b/implementations/C/joy.h @@ -80,27 +80,6 @@ void tdiv_q(JoyListPtr stack, JoyListPtr expression); void tdiv_r(JoyListPtr stack, JoyListPtr expression); void truthy(JoyListPtr stack, JoyListPtr expression); -void def_abs(JoyListPtr stack, JoyListPtr expression); -void def_anamorphism(JoyListPtr stack, JoyListPtr expression); -void def_app1(JoyListPtr stack, JoyListPtr expression); -void def_app2(JoyListPtr stack, JoyListPtr expression); -void def_app3(JoyListPtr stack, JoyListPtr expression); -void def_appN(JoyListPtr stack, JoyListPtr expression); -void def_at(JoyListPtr stack, JoyListPtr expression); -void def_average(JoyListPtr stack, JoyListPtr expression); -void def_b(JoyListPtr stack, JoyListPtr expression); -void def_binary(JoyListPtr stack, JoyListPtr expression); -void def_ccccons(JoyListPtr stack, JoyListPtr expression); -void def_ccons(JoyListPtr stack, JoyListPtr expression); -void def_cleave(JoyListPtr stack, JoyListPtr expression); -void def_clop(JoyListPtr stack, JoyListPtr expression); -void def_cmp(JoyListPtr stack, JoyListPtr expression); -void def_codi(JoyListPtr stack, JoyListPtr expression); -void def_codireco(JoyListPtr stack, JoyListPtr expression); -void def_dinfrirst(JoyListPtr stack, JoyListPtr expression); -void def_dipd(JoyListPtr stack, JoyListPtr expression); -void def_disenstacken(JoyListPtr stack, JoyListPtr expression); - struct dict_entry { char *name; diff --git a/implementations/C/keywords.c b/implementations/C/keywords.c index a2f70cb..6c37496 100644 --- a/implementations/C/keywords.c +++ b/implementations/C/keywords.c @@ -32,7 +32,8 @@ #line 4 "KEYWORDS.txt" #include "joy.h" -#line 7 "KEYWORDS.txt" +#include "definitions.h" +#line 8 "KEYWORDS.txt" struct dict_entry; #include /* maximum key range = 61, duplicates = 0 */ @@ -58,9 +59,9 @@ keyword_hash (register const char *str, register size_t len) 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 30, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 0, 5, - 25, 5, 62, 62, 30, 10, 62, 0, 20, 5, - 0, 0, 10, 62, 0, 0, 0, 15, 5, 15, + 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, + 20, 0, 62, 62, 30, 10, 62, 5, 25, 5, + 0, 0, 10, 62, 0, 0, 0, 15, 5, 10, 62, 10, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, @@ -94,7 +95,7 @@ in_word_set (register const char *str, register size_t len) { enum { - TOTAL_KEYWORDS = 37, + TOTAL_KEYWORDS = 38, MIN_WORD_LENGTH = 1, MAX_WORD_LENGTH = 12, MIN_HASH_VALUE = 1, @@ -104,97 +105,98 @@ in_word_set (register const char *str, register size_t len) static const struct dict_entry wordlist[] = { {""}, -#line 35 "KEYWORDS.txt" +#line 37 "KEYWORDS.txt" {"b", def_b}, -#line 33 "KEYWORDS.txt" +#line 35 "KEYWORDS.txt" {"at", def_at}, -#line 27 "KEYWORDS.txt" +#line 29 "KEYWORDS.txt" {"abs", def_abs}, -#line 18 "KEYWORDS.txt" - {"cons", cons}, -#line 24 "KEYWORDS.txt" - {"stack", stack}, #line 19 "KEYWORDS.txt" + {"cons", cons}, +#line 40 "KEYWORDS.txt" + {"ccons", def_ccons}, +#line 20 "KEYWORDS.txt" {"concat", concat}, - {""}, -#line 42 "KEYWORDS.txt" +#line 39 "KEYWORDS.txt" + {"ccccons", def_ccccons}, +#line 44 "KEYWORDS.txt" {"codireco", def_codireco}, {""}, -#line 38 "KEYWORDS.txt" - {"ccons", def_ccons}, -#line 22 "KEYWORDS.txt" - {"i", i_joyfunc}, -#line 37 "KEYWORDS.txt" - {"ccccons", def_ccccons}, +#line 25 "KEYWORDS.txt" + {"stack", stack}, #line 23 "KEYWORDS.txt" - {"pop", pop}, -#line 41 "KEYWORDS.txt" - {"codi", def_codi}, - {""}, -#line 28 "KEYWORDS.txt" - {"anamorphism", def_anamorphism}, -#line 34 "KEYWORDS.txt" + {"i", i_joyfunc}, +#line 36 "KEYWORDS.txt" {"average", def_average}, -#line 17 "KEYWORDS.txt" - {"cmp", cmp_joyfunc}, +#line 24 "KEYWORDS.txt" + {"pop", pop}, #line 43 "KEYWORDS.txt" + {"codi", def_codi}, +#line 28 "KEYWORDS.txt" + {"swons", def_swons}, +#line 30 "KEYWORDS.txt" + {"anamorphism", def_anamorphism}, + {""}, +#line 18 "KEYWORDS.txt" + {"cmp", cmp_joyfunc}, +#line 45 "KEYWORDS.txt" {"dinfrirst", def_dinfrirst}, {""}, -#line 25 "KEYWORDS.txt" - {"swaack", swaack}, -#line 45 "KEYWORDS.txt" - {"disenstacken", def_disenstacken}, -#line 20 "KEYWORDS.txt" - {"dip", dip}, -#line 14 "KEYWORDS.txt" - {"bool", truthy}, -#line 16 "KEYWORDS.txt" - {"clear", clear}, -#line 36 "KEYWORDS.txt" - {"binary", def_binary}, - {""}, -#line 21 "KEYWORDS.txt" - {"dup", dup}, #line 26 "KEYWORDS.txt" + {"swaack", swaack}, +#line 47 "KEYWORDS.txt" + {"disenstacken", def_disenstacken}, +#line 21 "KEYWORDS.txt" + {"dip", dip}, +#line 27 "KEYWORDS.txt" {"swap", swap}, {""}, -#line 39 "KEYWORDS.txt" +#line 38 "KEYWORDS.txt" + {"binary", def_binary}, + {""}, +#line 22 "KEYWORDS.txt" + {"dup", dup}, +#line 15 "KEYWORDS.txt" + {"bool", truthy}, +#line 17 "KEYWORDS.txt" + {"clear", clear}, +#line 41 "KEYWORDS.txt" {"cleave", def_cleave}, {""}, {""}, -#line 40 "KEYWORDS.txt" - {"clop", def_clop}, - {""}, -#line 15 "KEYWORDS.txt" - {"branch", branch}, - {""}, {""}, -#line 44 "KEYWORDS.txt" +#line 46 "KEYWORDS.txt" {"dipd", def_dipd}, {""}, -#line 13 "KEYWORDS.txt" +#line 16 "KEYWORDS.txt" + {"branch", branch}, + {""}, {""}, +#line 42 "KEYWORDS.txt" + {"clop", def_clop}, + {""}, +#line 14 "KEYWORDS.txt" {"/", tdiv_q}, {""}, {""}, -#line 32 "KEYWORDS.txt" +#line 34 "KEYWORDS.txt" {"appN", def_appN}, {""}, -#line 12 "KEYWORDS.txt" +#line 13 "KEYWORDS.txt" {"-", sub}, {""}, {""}, -#line 31 "KEYWORDS.txt" +#line 33 "KEYWORDS.txt" {"app3", def_app3}, {""}, -#line 11 "KEYWORDS.txt" +#line 12 "KEYWORDS.txt" {"+", add}, {""}, {""}, -#line 30 "KEYWORDS.txt" +#line 32 "KEYWORDS.txt" {"app2", def_app2}, {""}, -#line 10 "KEYWORDS.txt" +#line 11 "KEYWORDS.txt" {"*", mul}, {""}, {""}, -#line 29 "KEYWORDS.txt" +#line 31 "KEYWORDS.txt" {"app1", def_app1}, {""}, -#line 9 "KEYWORDS.txt" +#line 10 "KEYWORDS.txt" {"%", tdiv_r} };