1 /**
2 This class breaks up a string describing an expression
3 into tokens: numbers, parentheses, and operators.
4 */
5 public class ExpressionTokenizer
6 {
7 private String input;
8 private int start; // The start of the current token
9 private int end; // The position after the end of the current token
10
11 /**
12 Constructs a tokenizer.
13 @param anInput the string to tokenize
14 */
15 public ExpressionTokenizer(String anInput)
16 {
17 input = anInput;
18 start = 0;
19 end = 0;
20 nextToken(); // Find the first token
21 }
22
23 /**
24 Peeks at the next token without consuming it.
25 @return the next token or null if there are no more tokens
26 */
27 public String peekToken()
28 {
29 if (start >= input.length()) { return null; }
30 else { return input.substring(start, end); }
31 }
32
33 /**
34 Gets the next token and moves the tokenizer to the following token.
35 @return the next token or null if there are no more tokens
36 */
37 public String nextToken()
38 {
39 String r = peekToken();
40 start = end;
41 if (start >= input.length()) { return r; }
42 if (Character.isDigit(input.charAt(start)))
43 {
44 end = start + 1;
45 while (end < input.length()
46 && Character.isDigit(input.charAt(end)))
47 {
48 end++;
49 }
50 }
51 else
52 {
53 end = start + 1;
54 }
55 return r;
56 }
57 }