-
Notifications
You must be signed in to change notification settings - Fork 1
/
lexico.c
98 lines (82 loc) · 1.86 KB
/
lexico.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
#define _POSIX_SOURCE
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "lexico.h"
/* Este módulo sólo debería ser usado por el módulo léxico */
/* Variables y funciones PRIVADAS al módulo léxico */
static token_t token[MAX_TOKENS];
static char *nombre[MAX_TOKENS];
static int num_tokens=0;
static char especial[]="<>|";
static int separador(char c) {
if (strchr(especial,c) != NULL) return 1;
else return 0;
}
/* Funciones públicas */
/* solo tiene sentido usarlas desde un analizador sintáctico */
int trocea (char *s) {
char c;
int i=0;
int len=strlen(s);
num_tokens = 0;
while (isspace(s[i])) i++;
c=s[i];
while (i<len) {
if ( num_tokens == MAX_TOKENS ) {
/* El proximo token ya no cabe. Error */
num_tokens = 0;
return -1;
}
switch (c) {
case '|':
token[num_tokens] = TOK_TUBO;
c=s[++i];
break;
case '>':
if(s[i+1]=='>') {
token[num_tokens] = TOK_APPEND;
c=s[++i]; // Adelantem una posició més
}
else token[num_tokens] = TOK_MAYOR;
c=s[++i];
break;
case '<':
token[num_tokens] = TOK_MENOR; c=s[++i];
break;
case '2':
// Nomes serà un token si es tracta de 2>, així que en altre cas no hi ha break
if(s[i+1]=='>') {
token[num_tokens] = TOK_STDERR;
i=i+2;
c=s[i];
break;
}
default:
token[num_tokens] = TOK_NOMBRE;
nombre[num_tokens] = &s[i++];
while (!separador(s[i]) && !isspace(s[i])) i++;
c=s[i];
s[i] = '\0';
if (!separador(c)) c=s[++i];
}
while (isspace(s[i])) c=s[++i];
num_tokens++;
}
return 0;
}
token_t tipo_token (int i) {
if ( i >= 0 && i < num_tokens) {
return token[i];
} else {
return -1;
}
}
char * token_str (int i) {
if (i >= 0 && i < num_tokens) {
return nombre[i];
} else {
return NULL;
}
}
int numero_de_tokens() { return num_tokens;}