Generate definitions.h; swons

This commit is contained in:
Simon Forman 2023-02-05 13:38:59 -08:00
parent 78b59dda35
commit 291b6caa75
8 changed files with 243 additions and 118 deletions

View File

@ -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

View File

@ -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]"

View File

@ -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); }}')

View File

@ -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); }

View File

@ -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);

View File

@ -34,6 +34,8 @@ along with Thun. If not see <http://www.gnu.org/licenses/>.
#include <gmp.h>
#include "joy.h"
#include "definitions.h"
const char *BLANKS = " \t";

View File

@ -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;

View File

@ -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 <string.h>
/* 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}
};