-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscanner-unit.c
132 lines (125 loc) · 2.39 KB
/
scanner-unit.c
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
122
123
124
125
126
127
128
129
130
131
132
#include "scanner.h"
#include "ial.h"
void parser_clean()
{
}
char* debug_keyword(int type)
{
static char* keywords[] = {"boolean","break","class","continue","do","double",
"else","false","for","if","int","return","String","static","true","void","while",NULL};
return keywords[type];
}
stab_t* staticSym = NULL;
void printToken()
{
int typeOfToken = getLastToken();
switch(typeOfToken)
{
case TOK_ID:
printf("ID %s\n",getTokString());
break;
case TOK_SPECIAL_ID:
printf("SPECIALID %s\n",getTokString());
break;
case TOK_KEYWORD:
printf("KEYWORD %s\n", debug_keyword(getTokInt()));
break;
case TOK_CONST:
printf("NUM %d\n",getTokInt());
break;
case TOK_DOUBLECONST:
printf("DOUBLE %f\n",getTokDouble());
break;
case TOK_LITERAL:
printf("LITERAL '%s' \n",getTokString());
break;
case TOK_RIGHT_BRACE:
printf("}\n");
break;
case TOK_LEFT_BRACE:
printf("{\n");
break;
case TOK_RIGHT_PAR:
printf(")\n");
break;
case TOK_LEFT_PAR:
printf("(\n");
break;
case TOK_LE:
printf("<=\n");
break;
case TOK_GE:
printf(">=\n");
break;
case TOK_EOF:
printf("EOF\n");
break;
case TOK_DELIM: // ;
printf(";\n");
break;
case TOK_LIST_DELIM: // ,
printf(",\n");
break;
case TOK_ASSIGN: // =
printf("=\n");
break;
case TOK_EQ: // ==
printf("==\n");
break;
case TOK_NOTEQ: // !=
printf("!=\n");
break;
case TOK_LESS: // <
printf("<\n");
break;
case TOK_GREATER: // >
printf(">\n");
break;
case TOK_MUL: // *
printf("*\n");
break;
case TOK_DIV: //
printf("/\n");
break;
case TOK_PLUS: // +
printf("+\n");
break;
case TOK_MINUS: // >
printf("-\n");
break;
default:
printf("Unk token with type %d\n",getLastToken());
break;
}
}
int main(int argc, char* argv[])
{
char name[256] = "source.java";
if(argc >= 2)
snprintf(name,255,"%s",argv[1]);
int result = scanner_openFile(name);
if(result)
{
for(int i = 0; i < 2; i++)
{
scanner_rewind();
int typeOfToken;
while((typeOfToken= getToken()) != TOK_ERROR)
{
static int count = 0;
count++;
printf("%3d. ",count);
printToken(typeOfToken);
}
if(getLastToken() != TOK_EOF)
{
printf("Lexical error has occured.\n");
return 1;
}
}
scanner_closeFile();
} else {
printf("Error has occured while opening the file %s.\n",name);
}
return 0;
}