1
1
package top .nintha .json ;
2
2
3
- import java .io .IOException ;
4
- import java .io .PushbackReader ;
3
+ import top .nintha .json .util .TextCharIterator ;
5
4
6
5
public class Tokenizer {
7
6
8
- private final PushbackReader reader ;
7
+ private final TextCharIterator iterator ;
9
8
10
- public Tokenizer (PushbackReader reader ) {
11
- this .reader = reader ;
9
+ public Tokenizer (String text ) {
10
+ this .iterator = new TextCharIterator ( text ) ;
12
11
}
13
12
14
- public Token next () throws IOException {
15
- int v ;
16
- while ((v = reader .read ()) != -1 ) {
17
- char c = (char ) v ;
13
+ public Token next () {
14
+ while (iterator .hasNext ()) {
15
+ char c = iterator .next ();
18
16
if (Character .isWhitespace (c )) {
19
17
continue ;
20
18
}
@@ -23,7 +21,7 @@ public Token next() throws IOException {
23
21
return null ;
24
22
}
25
23
26
- private Token charToToken (char c ) throws IOException {
24
+ private Token charToToken (char c ) {
27
25
switch (c ) {
28
26
case ',' :
29
27
return new Token .Comma ();
@@ -54,12 +52,11 @@ private Token charToToken(char c) throws IOException {
54
52
}
55
53
}
56
54
57
- private String readText (char first ) throws IOException {
55
+ private String readText (char first ) {
58
56
StringBuilder sb = new StringBuilder ();
59
57
boolean escape = false ;
60
- int v ;
61
- while ((v = reader .read ()) != -1 ) {
62
- char c = (char ) v ;
58
+ while (iterator .hasNext ()) {
59
+ char c = iterator .next ();
63
60
if (c == first && !escape ) {
64
61
return sb .toString ();
65
62
}
@@ -77,44 +74,42 @@ private String readText(char first) throws IOException {
77
74
return sb .toString ();
78
75
}
79
76
80
- private double readNum (char first ) throws IOException {
77
+ private double readNum (char first ) {
81
78
StringBuilder sb = new StringBuilder (String .valueOf (first ));
82
79
boolean point = false ;
83
- int v ;
84
- while ((v = reader .read ()) != -1 ) {
85
- char c = (char ) v ;
80
+ while (iterator .hasNext ()) {
81
+ char c = iterator .peek ();
86
82
// number
87
83
if (c >= '0' && c <= '9' ) {
88
84
sb .append (c );
85
+ iterator .next ();
89
86
}
90
87
// point
91
88
else if (c == '.' ) {
92
89
if (point ) {
93
- reader .unread (c );
94
90
return Double .parseDouble (sb .toString ());
95
91
} else {
96
92
point = true ;
97
93
sb .append (c );
94
+ iterator .next ();
98
95
}
99
96
}
100
97
// other char
101
98
else {
102
- reader .unread (c );
103
99
return Double .parseDouble (sb .toString ());
104
100
}
105
101
}
106
102
return Double .parseDouble (sb .toString ());
107
103
}
108
104
109
- private Token readSymbol (char first ) throws IOException {
105
+ private Token readSymbol (char first ) {
110
106
StringBuilder sb = new StringBuilder (String .valueOf (first ));
111
- int v ;
112
- while ((v = reader .read ()) != -1 ) {
113
- char c = (char ) v ;
107
+ while (iterator .hasNext ()) {
108
+ char c = iterator .peek ();
114
109
if (c >= 'a' && c <= 'z' ) {
115
110
sb .append (c );
111
+ iterator .next ();
116
112
} else {
117
- reader .unread (c );
118
113
break ;
119
114
}
120
115
}
0 commit comments