3 #include "lambda.tab.h"
8 struct decllist *decls = NULL;
12 void yyerror(const char *str)
14 fprintf(stderr, "parse error: %s\n", str);
22 struct lambda *make_lambda()
24 return malloc(sizeof (struct lambda));
27 struct lambda *make_ident(char *i)
29 struct lambda *r = make_lambda();
30 r->which = lambda_ident;
31 r->data.identifier.ident = strdup(i);
32 r->data.identifier.revision = 0;
36 struct lambda *make_abstraction(char *i, struct lambda *t)
38 struct lambda *r = make_lambda();
39 r->which = lambda_abs;
40 r->data.abstraction.ident = strdup(i);
41 r->data.abstraction.revision = 0;
42 r->data.abstraction.expr = t;
46 struct lambda *make_application(struct lambda *t1, struct lambda *t2)
48 struct lambda *r = make_lambda();
49 r->which = lambda_app;
50 r->data.application.expr1 = t1;
51 r->data.application.expr2 = t2;
55 void decls_prepend(char *ident, struct lambda *value)
57 struct decllist *head = malloc(sizeof (struct decllist));
59 head->ident = strdup(ident);
61 printf("Declared %s as ", ident);
62 lambda_print(value, NULL);
66 struct lambda *decls_lookup(char *ident)
68 struct decllist *c = decls;
70 if(strcmp(c->ident, ident) == 0)
71 return copy(c->value);
74 return make_ident(ident);
82 lambda_free(decls->value);
91 %token LAMBDA DOT OBRACE CBRACE IDENT FUNC SEMICOLON ASSIGN
100 : FUNC ASSIGN term SEMICOLON
102 decls_prepend($1->data.identifier.ident, $3);
107 { $$ = make_application($1, $2); }
113 $$ = decls_lookup($1->data.identifier.ident);
118 $$ = make_ident($1->data.identifier.ident);
128 $$ = make_abstraction($1->data.identifier.ident, $2);