aboutsummaryrefslogtreecommitdiff
path: root/pc.c
blob: 19a77675de87476f399065ea3e5e944bb315b471 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

char* pretty_type(t)
int t;
{
	if (t == ARRAY) {
		return "ARRAY";
	} else if (t == INT - ARRAY) {
		return "ARRAY of INT";
	} else if (t == INT - ARRAY) {
		return "ARRAY of INT";
	} else if (t == INT) {
		return "INT";
	} else if (t == REAL) {
		return "REAL";
	} else if (t == BOOL) {
		return "BOOL";
	} else if (t == -1) {
		return "NO TYPE";
	} else {
		return "Unknown type";
	}
}

void debug_print(d, y)
int d;
union YYSTYPE* y;
{
#ifdef DEBUG
	if (d == PROG){
		fprintf(stderr, "[PROG]");
	} else if (d == VAR){
		fprintf(stderr, "[VAR]");
	} else if (d == PROC){
		fprintf(stderr, "[PROC]");
	} else if (d == FUNC){
		fprintf(stderr, "[FUNC]");
	} else if (d == BEG){
		fprintf(stderr, "[BEG]");
	} else if (d == END){
		fprintf(stderr, "[END]");
	} else if (d == ARRAY){
		fprintf(stderr, "[ARRAY]");
	} else if (d == OF){
		fprintf(stderr, "[OF]");
	} else if (d == INT){
		fprintf(stderr, "[INT]");
	} else if (d == REAL){
		fprintf(stderr, "[REAL]");
	} else if (d == IF){
		fprintf(stderr, "[IF]");
	} else if (d == THEN){
		fprintf(stderr, "[THEN]");
	} else if (d == ELSE){
		fprintf(stderr, "[ELSE]");
	} else if (d == WHILE){
		fprintf(stderr, "[WHILE]");
	} else if (d == DO){
		fprintf(stderr, "[DO]");
	} else if (d == NOT){
		fprintf(stderr, "[NOT]");
	} else if (d == DOTS){
		fprintf(stderr, "[ .. ]");
	} else if (d == ASSIGNOP){
		fprintf(stderr, "[ASSIGN]");
	} else if (d == RELOP){
		fprintf(stderr, "[RELOP:");
		if (y->opval == EQ){
			fprintf(stderr, "EQ");
		} else if (y->opval == NE){
			fprintf(stderr, "NE");
		} else if (y->opval == LT){
			fprintf(stderr, "LT");
		} else if (y->opval == LE){
			fprintf(stderr, "LE");
		} else if (y->opval == GT){
			fprintf(stderr, "GT");
		} else if (y->opval == GE){
			fprintf(stderr, "GE");
		} else if (y->opval == ADD){
			fprintf(stderr, "ADD");
		} else if (y->opval == SUB){
			fprintf(stderr, "SUB");
		} else if (y->opval == OR){
			fprintf(stderr, "OR");
		} else if (y->opval == MUL){
			fprintf(stderr, "MUL");
		} else if (y->opval == DIV){
			fprintf(stderr, "DIV");
		} else if (y->opval == AND){
			fprintf(stderr, "AND");
		}
		fprintf(stderr,"]");
	} else if (d == INUM) {
		fprintf(stderr, "[INUM: %d]", y->ival);
	} else if (d == RNUM) {
		fprintf(stderr, "[INUM: %f]", y->rval);
	} else if (d == ID) {
		fprintf(stderr, "[ID: %s]", y->sval);
	} else if (d == '\n') {
		fprintf(stderr, "\n");
	} else {
		fprintf(stderr, "{%c}", d);
	}
	fprintf(stderr, " ");
#endif
	return;
}

int yyerror(msg)
char* msg;
{
	fprintf(stderr, "\nError, line %d: %s\n", line_num, msg);
#ifdef DEBUG
	fprintf(stderr, "%s\n", yytext);
	exit(1);
#endif
	return 0;
}