Mercurial > hg > Members > kono > PLparser
comparison src/plparser/PropertyListStreamScanner.java @ 9:29e309b2f624
Try several Tokenizer
author | one |
---|---|
date | Thu, 02 Sep 2010 10:00:23 +0900 |
parents | |
children | 79d492bce828 |
comparison
equal
deleted
inserted
replaced
8:8d0f9c1816f5 | 9:29e309b2f624 |
---|---|
1 package plparser; | |
2 | |
3 import java.io.FileNotFoundException; | |
4 import java.io.FileReader; | |
5 import java.io.InputStream; | |
6 import java.io.InputStreamReader; | |
7 import java.io.Reader; | |
8 import java.io.StringReader; | |
9 import java.util.Scanner; | |
10 import java.util.regex.Pattern; | |
11 | |
12 /** | |
13 * delimiter に何を設定しても動いてくれない。 | |
14 * */ | |
15 | |
16 public class PropertyListStreamScanner<T> extends PLScannerImpl<T> implements | |
17 PLScanner<T> { | |
18 | |
19 private Scanner scan; | |
20 | |
21 public PropertyListStreamScanner( | |
22 PLScanner<T> s, | |
23 Dictionary<T> dict, Token<T> nullToken) { | |
24 this.dict = dict; | |
25 this.nullToken = nullToken; | |
26 } | |
27 | |
28 | |
29 public PropertyListStreamScanner(Dictionary<T> dict) { | |
30 this.dict = dict; | |
31 nullToken = new Token<T>("",TokenID.NULL); | |
32 } | |
33 | |
34 | |
35 public void init() { | |
36 String pattern = "."; | |
37 scan.useDelimiter(pattern); | |
38 } | |
39 | |
40 // Pattern must contain exact 1 group | |
41 private static Pattern tokenPat = Pattern.compile( | |
42 "([={}(),;])" | |
43 ); | |
44 private static Pattern namePat = Pattern.compile("([_a-zA-Z][\\@\\w]*)"); | |
45 private static final Pattern numPat = Pattern.compile("([0-9]+)"); | |
46 private static final Pattern stringPat1 = Pattern.compile("\\\"([^\"]*)\\\""); | |
47 private static final Pattern stringPat = Pattern.compile("\\'([^\\']*)\\'"); | |
48 private static final Pattern stringPat1cont = Pattern.compile("\\\"([^\"]*)$"); | |
49 private static final Pattern stringPatCont = Pattern.compile("\\'([^\\']*)$"); | |
50 private static final Pattern stringPat1End = Pattern.compile("([^\"]*)\\\""); | |
51 private static final Pattern stringPatEnd = Pattern.compile("([^\\']*)\'"); | |
52 private static final Pattern commentPat = Pattern.compile("(//.*)"); | |
53 private static final Pattern commentPat1 = Pattern.compile("(/\\*)"); | |
54 private static final Pattern commentPat1End = Pattern.compile("(.*\\*/)"); | |
55 private static final Pattern errorPat = Pattern.compile("([^\\s])"); | |
56 private static final Pattern anyPat = Pattern.compile("(.)"); | |
57 | |
58 @Override | |
59 public Token<T> nextToken() { | |
60 String s; | |
61 nextToken = nullToken; | |
62 while(hasRemaining()) { | |
63 if ((s=scan.next(tokenPat))!=null) { | |
64 Token<T> t; | |
65 if ((t = dict.get(s))==null) { | |
66 dict.put(s, t = new Token<T>(s,TokenID.Any)); | |
67 } | |
68 return nextToken = t; | |
69 } else if ((s=scan.next(stringPatCont))!=null) { | |
70 // non terminated string | |
71 String s1; | |
72 while((s1=scan.next(stringPatEnd))==null) { | |
73 s += scan.nextLine(); | |
74 lineno++; | |
75 } | |
76 s += s1; | |
77 Token<T> t; | |
78 if ((t = dict.get(s))==null) { | |
79 dict.put(s, t = new Token<T>(s,TokenID.VARIABLE)); | |
80 } | |
81 return nextToken = t; | |
82 } else if ((s=scan.next(stringPat1cont))!=null) { | |
83 // non terminated string | |
84 String s1; | |
85 while((s1=scan.next(stringPat1End))==null) { | |
86 s += scan.nextLine(); | |
87 lineno++; | |
88 } | |
89 s += s1; | |
90 Token<T> t; | |
91 if ((t = dict.get(s))==null) { | |
92 dict.put(s, t = new Token<T>(s,TokenID.VARIABLE)); | |
93 } | |
94 return nextToken = t; | |
95 } else if ((s=scan.next(stringPat))!=null||(s=scan.next(stringPat1))!=null||(s=scan.next(namePat))!=null) { | |
96 Token<T> t; | |
97 if ((t = dict.get(s))==null) { | |
98 dict.put(s, t = new Token<T>(s,TokenID.VARIABLE)); | |
99 } | |
100 if (t.type!=TokenID.VARIABLE) { | |
101 t = new Token<T>(s,TokenID.VARIABLE); | |
102 } | |
103 return nextToken = t; | |
104 } else if ((s=scan.next(numPat))!=null) { | |
105 return nextToken = new Token<T>(s,TokenID.NUMBER); | |
106 } else if ((s=scan.next(commentPat))!=null) { | |
107 scan.nextLine(); | |
108 continue; | |
109 } else if ((s=scan.next(commentPat1))!=null) { | |
110 while(scan.next(commentPat1End)==null) { | |
111 scan.nextLine(); | |
112 lineno++; | |
113 } | |
114 continue; | |
115 } else if ((s=scan.next(errorPat))!=null) { | |
116 error("Don't understand '"+s+"'"); | |
117 continue; | |
118 } else if ((s=scan.next(anyPat))!=null) { | |
119 // skip space | |
120 continue; | |
121 } else { | |
122 lineno++; | |
123 } | |
124 } | |
125 return nextToken; | |
126 } | |
127 | |
128 | |
129 @Override | |
130 public boolean hasRemaining() { | |
131 return scan.hasNext(anyPat); | |
132 } | |
133 | |
134 @Override | |
135 public PLScanner<T> pushScannerFile(InputStream newfile, | |
136 String prompt) { | |
137 return new PropertyListStreamScanner<T>(this,dict,nullToken).setFile(newfile,prompt); | |
138 } | |
139 | |
140 @Override | |
141 public PLScanner<T> pushScanner(String exp) { | |
142 return new PropertyListStreamScanner<T>(this,dict,nullToken).set(exp); | |
143 } | |
144 | |
145 @Override | |
146 public PLScanner<T> pushScannerFile(String file) | |
147 throws FileNotFoundException { | |
148 return new PropertyListStreamScanner<T>(this,dict,nullToken).setFile(file); | |
149 } | |
150 | |
151 @Override | |
152 public PLScanner<T> set(String exp) { | |
153 Reader reader = new StringReader(exp); | |
154 scan = new Scanner(reader); | |
155 return this; | |
156 } | |
157 | |
158 @Override | |
159 public PLScanner<T> setFile(String file) | |
160 throws FileNotFoundException { | |
161 Reader reader = new FileReader(file); | |
162 scan = new Scanner(reader); | |
163 return this; | |
164 } | |
165 | |
166 @Override | |
167 public PLScanner<T> set(InputStreamReader reader) { | |
168 scan = new Scanner(reader); | |
169 return this; | |
170 } | |
171 | |
172 | |
173 | |
174 } |