%{ #include "lambda.h" #include "lambda.tab.h" #include "mem.h" struct lambda *result; extern int yylex(); int yydebug=1; void yyerror(const char *str) { fprintf(stderr, "parse error: %s\n", str); } int yywrap() { return 1; } struct lambda *make_lambda() { return malloc(sizeof (struct lambda)); } struct lambda *make_ident(char *i) { struct lambda *r = make_lambda(); r->which = lambda_ident; r->data.identifier = strdup(i); return r; } struct lambda *make_abstraction(char *i, struct lambda *t) { struct lambda *r = make_lambda(); r->which = lambda_abs; r->data.abstraction.ident = strdup(i); r->data.abstraction.expr = t; return r; } struct lambda *make_application(struct lambda *t1, struct lambda *t2) { struct lambda *r = make_lambda(); r->which = lambda_app; r->data.application.expr1 = t1; r->data.application.expr2 = t2; return r; } %} %token LAMBDA DOT OBRACE CBRACE IDENT I K S T F %% lambda : term { result = $$; } term : term appterm { $$ = make_application($1, $2); } | appterm { $$ = $1; } appterm : IDENT { $$ = make_ident($1->data.identifier); lambda_free($1); } | LAMBDA IDENT DOT term { $$ = make_abstraction($2->data.identifier, $4); lambda_free($2); } | OBRACE term CBRACE { $$ = $2; } | I { $$ = make_abstraction("x", make_ident("x")); } | K { $$ = make_abstraction("x", make_abstraction("y", make_ident("x"))); } | S { $$ = make_abstraction("x", make_abstraction("y", make_abstraction("z", make_application(make_application(make_ident("x"), make_ident("y")), make_application(make_ident("y"), make_ident("z")))))); } | T { $$ = make_abstraction("x", make_abstraction("y", make_ident("x"))); } | F { $$ = make_abstraction("x", make_abstraction("y", make_ident("y"))); }