-
Notifications
You must be signed in to change notification settings - Fork 0
/
lextest.c
123 lines (115 loc) · 2.39 KB
/
lextest.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
#include <assert.h>
#include <stdio.h>
#include "c0lex.h"
void printb(int a){
int m=a%2;
a=a/2;
if(a)printb(a);
printf("%d",m);
}
void analyse(){
Symbol sym=tokeninfo.sym;
if(CONSTSY<=sym && sym<=RETURNSY){
printf("关键字 ");
switch(sym){
case CONSTSY:
printf("const");break;
case INTSY:
printf("int");break;
case FLOATSY:
printf("flaot");break;
case STRINGSY:
printf("string");break;
case VOIDSY:
printf("void");break;
case IFSY:
printf("if");break;
case ELSESY:
printf("else");break;
case WHILESY:
printf("while");break;
case MAINSY:
printf("main");break;
case SCANFSY:
printf("scanf");break;
case ASSSY:
printf("=");break;
case RETURNSY:
printf("return");break;
case PRINTFSY:
printf("printf");break;
}
}else if(ADDSY<=sym && sym<=MINUSSY){
printf("加法运算符 ");
switch(sym){
case ADDSY:
printf("+");break;
case MINUSSY:
printf("-");break;
}
}else if(MUSY<=sym && sym<=DISY){
printf("乘法运算符 ");
switch(sym){
case MUSY:
printf("*");break;
case DISY:
printf("/");break;
}
}else if(EQSY<=sym && sym<=NESY){
printf("比较运算符 ");
switch(sym){
case EQSY:
printf("==");break;
case GESY:
printf(">=");break;
case LESY:
printf("<=");break;
case LSY:
printf("<");break;
case GSY:
printf(">");break;
case NESY:
printf("!=");break;
}
}else if(LPSY<=sym && sym<=SEMISY){
printf("分界符 ");
switch(sym){
case LPSY:
printf("(");break;
case RPSY:
printf(")");break;
case LPKSY:
printf("{");break;
case RPKSY:
printf("}");break;
case COMMASY:
printf(",");break;
case SEMISY:
printf(";");break;
case ASSSY:
printf("=");break;
}
}else if(sym==IDSY){
printf("标识符 ");printf(tokeninfo.u.str);
}else if(sym==INT){
printf("整数 ");printb(tokeninfo.u.num);// 不知道为什么要二进制数据
printf("(二进制)");
}else if(sym==FLOAT){
printf("浮点数 ");printf("%lf",tokeninfo.u.f);
}else if(sym==STRING){
printf("字符串 ");printf("%s",tokeninfo.u.str);
}
printf("\n");
}
int main(int argc, char *argv[]){
assert(argc == 2);
freopen(argv[1],"r",stdin);
printf("类型 值\n");
int ret;
while(ret=get()){
if(ret==1){
analyse();
}
}
return 0;
}