-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTokenizer.java
More file actions
65 lines (57 loc) · 1.26 KB
/
Tokenizer.java
File metadata and controls
65 lines (57 loc) · 1.26 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
package calc;
import java.util.LinkedList;
public class Tokenizer {
//returns a list of tokens
LinkedList<String> tokenize(String expr) throws Exception {
LinkedList<String> tokens = new LinkedList<String>();
expr = new Parenthesizer().parenthesize(expr);
String token = "";
int i = 0;
char c;
while (i < expr.length())
{
c = expr.charAt(i);
if (c == '(' || c == ')' || isOp(c))
{
token = c + "";
i ++;
}
else if (isNum(c))
{
int j = i;
while(j < expr.length() && isNum(expr.charAt(j)))
j ++;
token = expr.substring(i,j);
i = j;
}
else if (isAlpha(c))
{
int j = i;
while(j < expr.length() && isAlpha(expr.charAt(j)))
j ++;
token = expr.substring(i,j);
i = j;
}
else if (c == ' ')
{
i ++;
continue;
}
else
throw new UnknownSymbolException("" + c);
tokens.add(token);
}
//System.out.println(tokens); DEBUG
return tokens;
}
boolean isNum(char c) {
return ('0' <= c && c <= '9') || (c == '.');
}
boolean isAlpha(char c) {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
boolean isOp(char c) {
String ops = "+-*/^";
return ops.contains(c+"");
}
}