literals
[lambda.git] / print.c
1 #include <stdio.h>
2 #include "lambda.h"
3
4 void print_apos(unsigned int revision)
5 {
6 if(revision == 1)
7 printf("\'");
8 if(revision > 2){
9 printf("\"");
10 print_apos(revision - 2);
11 }
12 }
13
14 void print_ident(char *ident, unsigned int revision)
15 {
16 printf("%s", ident);
17 while(revision > 2){
18 putchar('\"');
19 revision -= 2;
20 }
21 if(revision == 1)
22 putchar('\'');
23 }
24
25 void term_print(struct lambda *t, struct lambda *mark)
26 {
27 if(t == mark)
28 putchar('|');
29 switch(t->which){
30 case lambda_ident:
31 print_ident(t->data.identifier.ident, t->data.identifier.revision);
32 break;
33 case lambda_abs:
34 printf("λ");
35 print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
36 while((t = t->data.abstraction.expr)->which == lambda_abs){
37 putchar(' ');
38 print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
39 }
40 putchar('.');
41 term_print(t, mark);
42 break;
43 case lambda_app:
44 if(t->data.application.expr1->which == lambda_abs)
45 putchar('(');
46 term_print(t->data.application.expr1, mark);
47 if(t->data.application.expr1->which == lambda_abs)
48 putchar(')');
49
50 putchar(' ');
51
52 if(t->data.application.expr2->which == lambda_app)
53 putchar('(');
54 term_print(t->data.application.expr2, mark);
55 if(t->data.application.expr2->which == lambda_app)
56 putchar(')');
57 break;
58 }
59 if(t == mark)
60 putchar('|');
61 }
62
63 void lambda_print(struct lambda *t, struct lambda *mark)
64 {
65 term_print(t, mark);
66 putchar('\n');
67 }