3 #include "lambda.tab.h"
7 struct decllist *decls = NULL;
11 void yyerror(const char *str)
13 fprintf(stderr, "parse error: %s\n", str);
21 struct lambda *make_lambda()
23 return malloc(sizeof (struct lambda));
26 struct lambda *make_ident(char *i)
28 struct lambda *r = make_lambda();
29 r->which = lambda_ident;
30 r->data.identifier = strdup(i);
34 struct lambda *make_abstraction(char *i, struct lambda *t)
36 struct lambda *r = make_lambda();
37 r->which = lambda_abs;
38 r->data.abstraction.ident = strdup(i);
39 r->data.abstraction.expr = t;
43 struct lambda *make_application(struct lambda *t1, struct lambda *t2)
45 struct lambda *r = make_lambda();
46 r->which = lambda_app;
47 r->data.application.expr1 = t1;
48 r->data.application.expr2 = t2;
52 void decls_prepend(char *ident, struct lambda *value)
54 printf("add: %s\n", ident);
55 struct decllist *head = malloc(sizeof (struct decllist));
62 struct lambda *decls_lookup(char *ident)
64 printf("lookup: %s\n", ident);
65 struct decllist *c = decls;
67 if(strcmp(c->ident, ident) == 0)
68 return copy(c->value);
72 return make_ident(ident);
77 %token LAMBDA DOT OBRACE CBRACE IDENT FUNC SEMICOLON ASSIGN
86 : FUNC ASSIGN term SEMICOLON
87 { decls_prepend($1->data.identifier, $3); }
90 { $$ = make_application($1, $2); }
96 $$ = decls_lookup($1->data.identifier);
101 $$ = make_ident($1->data.identifier);
111 $$ = make_abstraction($1->data.identifier, $2);