-
Notifications
You must be signed in to change notification settings - Fork 0
/
VeryBasicTokenizer.java
88 lines (73 loc) · 2.28 KB
/
VeryBasicTokenizer.java
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
/*
TURMA 04G11
NOME: ERIK SAMUEL VIANA HSU TIA: 32265921
NOME: MATEUS KENZO IOCHIMOTO TIA: 32216289
NOME: RODRIGO MACHADO DE ASSIS OLIVEIRA DE LIMA TIA: 32234678
NOME: THIAGO SHIHAN CARDOSO TOMA TIA: 32210744
*/
import java.util.ArrayList;
import java.util.List;
public class VeryBasicTokenizer {
private char[] input;
private int index;
public VeryBasicTokenizer(String str) {
input = str.toCharArray();
index = 0;
}
//Avanca para o proximo caractere e retorna seu valor.
//Ou retorna \o quando chegou no final da string
private char getNextChar() {
if (index >= input.length) {return '\0';}
return input[index++];
}
//separa a string em tokens e retorna uma lista de strings,
//sendo que cada string e um token reconhecido pelo metodo
public List<String> tokenize(){
List<String > tokens = new ArrayList<>();
StringBuilder sb = new StringBuilder();
char currChar = getNextChar();
boolean isTokenizing = true;
while(isTokenizing) {
//ignora os espacos em branco
while (Character.isWhitespace(currChar))
currChar = getNextChar();
if (Character.isDigit(currChar)) {//Reconhece numero (inteiro/decimal)
sb.setLength(0);
boolean ParteDecimal = false;
while (Character.isDigit(currChar) || (currChar == '.' && ParteDecimal==false)) {
if(currChar == '.') {
ParteDecimal = true;
}
sb.append(currChar);
currChar = getNextChar();
}
tokens.add(sb.toString());
} else if (currChar == '+') {//Reconhece simbolo +
tokens.add("+");
currChar = getNextChar();
} else if (currChar =='*') {//Reconhece simbolo *
tokens.add("*");
currChar = getNextChar();
} else if (currChar =='-') {//Reconhece simbolo -
tokens.add("-");
currChar = getNextChar();
} else if (currChar =='/') {//Reconhece simbolo /
tokens.add("/");
currChar = getNextChar();
} else if (currChar == '(') {//Reconhece simbolo (
tokens.add("(");
currChar = getNextChar();
} else if (currChar == ')') {//Reconhece simbolo )
tokens.add(")");
currChar = getNextChar();
} else if (currChar == '\0') {
isTokenizing = false;
}else {
System.out.println("token não reconhecido: "+ currChar);
tokens.add("F");
isTokenizing = false;
}
}
return tokens;
}
}