Make sure to print a stack trace whenever an error signal is delivered
[oota-llvm.git] / utils / Burg / delta.c
1 char rcsid_delta[] = "$Id$";
2
3 #include <stdio.h>
4 #include "b.h"
5 #include "fe.h"
6
7 int principleCost = 0;
8 int lexical = 0;
9
10 #ifndef NOLEX
11 void
12 ASSIGNCOST(l, r) DeltaPtr l; DeltaPtr r;
13 {
14         int i;
15
16         if (lexical) {
17                 for (i = 0; i < DELTAWIDTH; i++) {
18                         l[i] = r[i];
19                 }
20         } else {
21                         l[0] = r[0];
22         }
23 }
24
25 void
26 ADDCOST(l, r) DeltaPtr l; DeltaPtr r;
27 {
28         int i;
29
30         if (lexical) {
31                 for (i = 0; i < DELTAWIDTH; i++) {
32                         l[i] += r[i];
33                 }
34         } else {
35                 l[0] += r[0];
36         }
37 }
38
39 void
40 MINUSCOST(l, r) DeltaPtr l; DeltaPtr r;
41 {
42         int i;
43
44         if (lexical) {
45                 for (i = 0; i < DELTAWIDTH; i++) {
46                         l[i] -= r[i];
47                 }
48         } else {
49                 l[0] -= r[0];
50         }
51 }
52
53 void
54 ZEROCOST(x) DeltaPtr x;
55 {
56         int i;
57
58         if (lexical) {
59                 for (i = 0; i < DELTAWIDTH; i++) {
60                         x[i] = 0;
61                 }
62         } else {
63                 x[0] = 0;
64         }
65 }
66
67 int
68 LESSCOST(l, r) DeltaPtr l; DeltaPtr r;
69 {
70         int i;
71
72         if (lexical) {
73                 for (i = 0; i < DELTAWIDTH; i++) {
74                         if (l[i] < r[i]) {
75                                 return 1;
76                         } else if (l[i] > r[i]) {
77                                 return 0;
78                         }
79                 }
80                 return 0;
81         } else {
82                 return l[0] < r[0];
83         }
84 }
85
86 int
87 EQUALCOST(l, r) DeltaPtr l; DeltaPtr r;
88 {
89         int i;
90
91         if (lexical) {
92                 for (i = 0; i < DELTAWIDTH; i++) {
93                         if (l[i] != r[i]) {
94                                 return 0;
95                         }
96                 }
97                 return 1;
98         } else {
99                 return l[0] == r[0];
100         }
101 }
102 #endif /* NOLEX */
103
104 void
105 CHECKDIVERGE(c, its, nt, base) DeltaPtr c; Item_Set its; int nt; int base;
106 {
107         int i;
108
109         if (prevent_divergence <= 0) {
110                 return;
111         }
112         if (lexical) {
113 #ifndef NOLEX
114                 for (i = 0; i < DELTAWIDTH; i++) {
115                         if (c[i] > prevent_divergence) {
116                                 char ntname[100];
117                                 char basename[100];
118                                 nonTerminalName(ntname, nt);
119                                 nonTerminalName(basename, base);
120                                 fprintf(stderr, "ERROR:  The grammar appears to diverge\n");
121                                 fprintf(stderr, "\tRelative Costs: %s(0), %s(%d)\n", basename, ntname, c[i]);
122                                 fprintf(stderr, "\tOffending Operator: %s\n", its->op->name);
123                                 fprintf(stderr, "\tOffending Tree: ");
124                                 printRepresentative(stderr, its);
125                                 fprintf(stderr, "\n");
126                                 exit(1);
127                         }
128                 }
129 #endif /*NOLEX*/
130         } else if (PRINCIPLECOST(c) > prevent_divergence) {
131                 char ntname[100];
132                 char basename[100];
133                 nonTerminalName(ntname, nt);
134                 nonTerminalName(basename, base);
135                 fprintf(stderr, "ERROR:  The grammar appears to diverge\n");
136                 fprintf(stderr, "\tRelative Costs: %s(0), %s(%d)\n", basename, ntname, PRINCIPLECOST(c));
137                 fprintf(stderr, "\tOffending Operator: %s\n", its->op->name);
138                 fprintf(stderr, "\tOffending Tree: ");
139                 printRepresentative(stderr, its);
140                 fprintf(stderr, "\n");
141                 exit(1);
142         }
143 }