-
Notifications
You must be signed in to change notification settings - Fork 0
/
operator.c
executable file
·122 lines (120 loc) · 3.66 KB
/
operator.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
#include "lexheader.h"
struct listnode* processoperators(struct listnode *newnode,int c)
{
int expect[10],ifyes[10],code;
newnode->token.tokentype=OPERATOR;
switch(c)
{
case '+' : expect[0]='+';
ifyes[0]=PLUSPLUS;
expect[1]='=' ;
ifyes[1]=PLUSEQ;
code=lookahead(expect,ifyes,2);
if(code)
newnode->token.Ctoken.operator->code=code;
else
newnode->token.Ctoken.operator->code=c;
return newnode;
case '-' : expect[0]='-';
ifyes[0]=MINUSMINUS;
expect[1]='=';
ifyes[1]=MINUSEQ;
expect[2]='>';
ifyes[2]=ARROW;
code=lookahead(expect,ifyes,3);
if(code)
newnode->token.Ctoken.operator->code=code;
else
newnode->token.Ctoken.operator->code=c;
return newnode;
case '*' : expect[0]='=';
ifyes[0]=STAREQ;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
else
newnode->token.Ctoken.operator->code=c;
return newnode;
case '/': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=SLASHEQ;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '^' : newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=EXOREQ;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '%': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=MODEQ;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '=': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=EQ;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '!': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=NE;
if( (code=lookahead(expect,ifyes,1)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '|': newnode->token.Ctoken.operator->code=c;
expect[0]='|';
ifyes[0]=OR;
expect[1]='=';
ifyes[1]=OREQ;
if( (code=lookahead(expect,ifyes,2)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '&': newnode->token.Ctoken.operator->code=c;
expect[0]='&';
ifyes[0]=AND;
expect[1]='=';
ifyes[1]=ANDEQ;
if( (code=lookahead(expect,ifyes,2)) != 0 )
newnode->token.Ctoken.operator->code=code;
return newnode;
case '<': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=LE;
expect[1]='<';
ifyes[1]=LS;
if( (code=lookahead(expect,ifyes,2)) != 0 )
newnode->token.Ctoken.operator->code=code;
if(code==LS)
{ expect[0]='=';
ifyes[0]=LSE;
if( (code=lookahead(expect,ifyes,1))!=0 )
newnode->token.Ctoken.operator->code=code;
}
return newnode;
case '>': newnode->token.Ctoken.operator->code=c;
expect[0]='=';
ifyes[0]=GE;
expect[1]='>';
ifyes[1]=RS;
if( (code=lookahead(expect,ifyes,2)) != 0 )
newnode->token.Ctoken.operator->code=code;
if(code==RS)
{ expect[0]='=';
ifyes[0]=RSE;
if( (code=lookahead(expect,ifyes,1))!=0 )
newnode->token.Ctoken.operator->code=code;
}
return newnode;
case '?' : newnode->token.Ctoken.operator->code=c;
if( (code=trigraph()) != 0 )
return processoperators(newnode,c); /*recursion*/
/*else return '?' to stream*/
ungetc(c,yyin);
return newnode;
default: newnode->token.Ctoken.operator->code=c;
return newnode;
}/*end of switch*/
}/*End of process operators*/