-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlexer.c
More file actions
119 lines (111 loc) · 3.02 KB
/
lexer.c
File metadata and controls
119 lines (111 loc) · 3.02 KB
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
/*
* lexer.c - Analisador Léxico do compilador
*
* Responsável por tokenizar o código fonte preprocessado.
*/
#include "cc.h"
/*============================================================================
* Funções de Debug
*============================================================================*/
void printToken(int n)
{
printf("%3d %2d:%03d %d \t%s\n", n + 1, cd.token[n].filenumber,
cd.token[n].linenumber, cd.token[n].type, cd.token[n].token);
}
/*============================================================================
* Configuração de Token
*============================================================================*/
void setToken(TOKEN *token, HASH *pHash)
{
char *tkstr = token->token;
if (token->type == TK_SYMBOL || token->type == TK_NAME)
{
token->ival = put(tkstr, NULL, pHash);
}
else if (token->type == TK_NUMBER)
{
token->type = strchr(tkstr, '.') != NULL ? TK_DOUBLE : TK_INT;
if (token->type == TK_DOUBLE) token->dval = strtod(tkstr, NULL);
else token->ival = strtoul(tkstr, NULL, tolower(tkstr[1]) == 'x' ? 16 : 10);
}
else if (tkstr[0] == '\'')
{
token->type = TK_CHAR;
token->ival = tkstr[1] != '\\' ? tkstr[1] : esc_char(tkstr + 2);
}
else
{
char *pTail = &tkstr[strlen(tkstr) - 1];
if (*pTail == '\"') *pTail = '\0';
token->ival = put(tkstr + 1, NULL, pHash);
}
}
/*============================================================================
* Analisador Léxico Principal
*============================================================================*/
void lex(void)
{
char *p, *pBgn, op2[4], token[256];
int n, type, nToken = 0, sizeToken = 1000;
cd.token = xalloc(sizeToken * sizeof(TOKEN));
for (n = 0; n < mcc.nSrcLine; n++)
{
SRCLINE *pSrc = &mcc.pSrcLine[n];
for (p = pSrc->srccode; *p != '\0';)
{
if (*p <= ' ')
{
p++;
continue;
}
pBgn = p;
if (*p == '\"' || *p == '\'')
{
type = TK_STRING;
p = endOfQuote(pBgn);
}
else if (isdigit(*p))
{
type = TK_NUMBER;
if (*p == '0' && (p[1] == 'x' || p[1] == 'X')) strtol(p, &p, 16);
else strtod(p, &p);
}
else if (isAlpha(*p))
{
type = TK_NAME;
for (p++; *p != '\0' && isAlNum(*p);) p++;
}
else if (strncmp(p, "...", 3) == 0)
{
type = TK_NAME;
p += 3;
}
else
{
type = TK_SYMBOL;
sprintf(op2, "%c%c ", p[0], p[1]);
p += strstr(OPERATOR2, op2) != NULL ? 2 : 1;
}
if (nToken >= sizeToken - 1)
{
sizeToken = sizeToken * 3 / 2;
cd.token = xrealloc(cd.token, sizeToken * sizeof(TOKEN));
}
sprintf(token, "%.*s", (int)(p - pBgn), pBgn);
if (nToken > 0 && cd.token[nToken - 1].type == TK_STRING && type == TK_STRING)
{
char *tk1 = cd.token[nToken - 1].token;
int len = strlen(tk1);
char *tk = xrealloc(tk1, len + (p - pBgn));
strcpy(tk + len - 1, token + 1);
cd.token[nToken - 1].token = tk;
}
else
{
TOKEN tkn = { type, 0, 0.0, xstrdup(token), pSrc->filenumber, pSrc->linenumber };
memcpy(&cd.token[nToken++], &tkn, sizeof(TOKEN));
}
}
}
cd.nToken = nToken;
}