3 #include "lambda.tab.h"
10 void yyerror(const char *str)
12 fprintf(stderr, "parse error: %s\n", str);
20 struct lambda *make_lambda()
22 return malloc(sizeof (struct lambda));
25 struct lambda *make_ident(char *i)
27 struct lambda *r = make_lambda();
28 r->which = lambda_ident;
29 r->data.identifier = strdup(i);
33 struct lambda *make_abstraction(char *i, struct lambda *t)
35 struct lambda *r = make_lambda();
36 r->which = lambda_abs;
37 r->data.abstraction.ident = strdup(i);
38 r->data.abstraction.expr = t;
42 struct lambda *make_application(struct lambda *t1, struct lambda *t2)
44 struct lambda *r = make_lambda();
45 r->which = lambda_app;
46 r->data.application.expr1 = t1;
47 r->data.application.expr2 = t2;
53 %token LAMBDA DOT OBRACE CBRACE IDENT I K S T F
63 $$ = make_application($1, $2);
70 $$ = make_ident($1->data.identifier);
73 | LAMBDA IDENT DOT term
75 $$ = make_abstraction($2->data.identifier, $4);
81 { $$ = make_abstraction("x", make_ident("x")); }
83 { $$ = make_abstraction("x", make_abstraction("y", make_ident("x"))); }
85 { $$ = make_abstraction("x", make_abstraction("y", make_abstraction("z",
86 make_application(make_application(make_ident("x"), make_ident("y")),
87 make_application(make_ident("y"), make_ident("z"))))));
90 { $$ = make_abstraction("x", make_abstraction("y", make_ident("x"))); }
92 { $$ = make_abstraction("x", make_abstraction("y", make_ident("y"))); }