annotate src/plparser/PropertyListStreamScanner.java @ 11:79d492bce828

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