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

clean up
author one
date Thu, 02 Sep 2010 11:55:56 +0900
parents
children da8c1569b0c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
79d492bce828 clean up
one
parents:
diff changeset
1 package plparser;
79d492bce828 clean up
one
parents:
diff changeset
2
79d492bce828 clean up
one
parents:
diff changeset
3 import java.io.FileNotFoundException;
79d492bce828 clean up
one
parents:
diff changeset
4 import java.io.FileReader;
79d492bce828 clean up
one
parents:
diff changeset
5 import java.io.IOException;
79d492bce828 clean up
one
parents:
diff changeset
6 import java.io.InputStreamReader;
79d492bce828 clean up
one
parents:
diff changeset
7 import java.nio.CharBuffer;
79d492bce828 clean up
one
parents:
diff changeset
8
79d492bce828 clean up
one
parents:
diff changeset
9 public abstract class PLCharScannerImpl<Node> extends PLScannerImpl<Node> {
79d492bce828 clean up
one
parents:
diff changeset
10
79d492bce828 clean up
one
parents:
diff changeset
11 public CharBuffer cb;
79d492bce828 clean up
one
parents:
diff changeset
12
79d492bce828 clean up
one
parents:
diff changeset
13
79d492bce828 clean up
one
parents:
diff changeset
14 public PLCharScannerImpl(PLScanner<Node> plScannerImpl, Dictionary<Node> dict,
79d492bce828 clean up
one
parents:
diff changeset
15 Token<Node> nullToken) {
79d492bce828 clean up
one
parents:
diff changeset
16 super(plScannerImpl, dict, nullToken);
79d492bce828 clean up
one
parents:
diff changeset
17 }
79d492bce828 clean up
one
parents:
diff changeset
18
79d492bce828 clean up
one
parents:
diff changeset
19 public PLCharScannerImpl() {
79d492bce828 clean up
one
parents:
diff changeset
20 super();
79d492bce828 clean up
one
parents:
diff changeset
21 }
79d492bce828 clean up
one
parents:
diff changeset
22
79d492bce828 clean up
one
parents:
diff changeset
23 public Token<Node> lookupDict(CharBuffer w, TokenID id) {
79d492bce828 clean up
one
parents:
diff changeset
24 Token<Node> t;
79d492bce828 clean up
one
parents:
diff changeset
25 String s = w.flip().toString();
79d492bce828 clean up
one
parents:
diff changeset
26 if ((t = dict.get(s))==null) {
79d492bce828 clean up
one
parents:
diff changeset
27 dict.put(s, t = new Token<Node>(s,id));
79d492bce828 clean up
one
parents:
diff changeset
28 }
79d492bce828 clean up
one
parents:
diff changeset
29 return nextToken = t;
79d492bce828 clean up
one
parents:
diff changeset
30 }
79d492bce828 clean up
one
parents:
diff changeset
31
79d492bce828 clean up
one
parents:
diff changeset
32 public char nextChar() {
79d492bce828 clean up
one
parents:
diff changeset
33 if (!cb.hasRemaining()) extendInput();
79d492bce828 clean up
one
parents:
diff changeset
34 char ch = cb.get();
79d492bce828 clean up
one
parents:
diff changeset
35 if (ch=='\n') lineno++;
79d492bce828 clean up
one
parents:
diff changeset
36 return ch;
79d492bce828 clean up
one
parents:
diff changeset
37 }
79d492bce828 clean up
one
parents:
diff changeset
38
79d492bce828 clean up
one
parents:
diff changeset
39 @Override
79d492bce828 clean up
one
parents:
diff changeset
40 public boolean hasRemaining() {
79d492bce828 clean up
one
parents:
diff changeset
41 return cb.hasRemaining()||extendInput();
79d492bce828 clean up
one
parents:
diff changeset
42 }
79d492bce828 clean up
one
parents:
diff changeset
43
79d492bce828 clean up
one
parents:
diff changeset
44 protected boolean extendInput() {
79d492bce828 clean up
one
parents:
diff changeset
45 if (file!=null && cb.position()!=0) {
79d492bce828 clean up
one
parents:
diff changeset
46 // move remaining data to the top, set position for next read
79d492bce828 clean up
one
parents:
diff changeset
47 cb.compact();
79d492bce828 clean up
one
parents:
diff changeset
48 try {
79d492bce828 clean up
one
parents:
diff changeset
49 if (prompt!=null) System.out.print(prompt);
79d492bce828 clean up
one
parents:
diff changeset
50 if (file.read(cb)>0) {
79d492bce828 clean up
one
parents:
diff changeset
51 cb.flip(); // prepare for get
79d492bce828 clean up
one
parents:
diff changeset
52 return true;
79d492bce828 clean up
one
parents:
diff changeset
53 } else {
79d492bce828 clean up
one
parents:
diff changeset
54 throw new IOException();
79d492bce828 clean up
one
parents:
diff changeset
55 }
79d492bce828 clean up
one
parents:
diff changeset
56 } catch (IOException e) {
79d492bce828 clean up
one
parents:
diff changeset
57 file = null ;
79d492bce828 clean up
one
parents:
diff changeset
58 cb.flip();
79d492bce828 clean up
one
parents:
diff changeset
59 }
79d492bce828 clean up
one
parents:
diff changeset
60 }
79d492bce828 clean up
one
parents:
diff changeset
61 return false;
79d492bce828 clean up
one
parents:
diff changeset
62 }
79d492bce828 clean up
one
parents:
diff changeset
63
79d492bce828 clean up
one
parents:
diff changeset
64 @Override
79d492bce828 clean up
one
parents:
diff changeset
65 public PLScanner<Node> set(String exp) {
79d492bce828 clean up
one
parents:
diff changeset
66 cb = CharBuffer.wrap(exp);
79d492bce828 clean up
one
parents:
diff changeset
67 filename = null; file = null;
79d492bce828 clean up
one
parents:
diff changeset
68 nextToken = nullToken;
79d492bce828 clean up
one
parents:
diff changeset
69 return this;
79d492bce828 clean up
one
parents:
diff changeset
70 }
79d492bce828 clean up
one
parents:
diff changeset
71
79d492bce828 clean up
one
parents:
diff changeset
72 @Override
79d492bce828 clean up
one
parents:
diff changeset
73 public PLScanner<Node> setFile(String file) throws FileNotFoundException {
79d492bce828 clean up
one
parents:
diff changeset
74 this.filename = file;
79d492bce828 clean up
one
parents:
diff changeset
75 nextToken = nullToken;
79d492bce828 clean up
one
parents:
diff changeset
76 set(new FileReader(file));
79d492bce828 clean up
one
parents:
diff changeset
77 return this;
79d492bce828 clean up
one
parents:
diff changeset
78 }
79d492bce828 clean up
one
parents:
diff changeset
79
79d492bce828 clean up
one
parents:
diff changeset
80 @Override
79d492bce828 clean up
one
parents:
diff changeset
81 public PLScanner<Node> set(InputStreamReader file) {
79d492bce828 clean up
one
parents:
diff changeset
82 this.file = file;
79d492bce828 clean up
one
parents:
diff changeset
83 cb = CharBuffer.allocate(BufferSize);
79d492bce828 clean up
one
parents:
diff changeset
84 try {
79d492bce828 clean up
one
parents:
diff changeset
85 if (prompt!=null) System.out.print(prompt);
79d492bce828 clean up
one
parents:
diff changeset
86 if (file.read(cb) <= 0) {
79d492bce828 clean up
one
parents:
diff changeset
87 throw new IOException();
79d492bce828 clean up
one
parents:
diff changeset
88 }
79d492bce828 clean up
one
parents:
diff changeset
89 } catch (IOException e) {
79d492bce828 clean up
one
parents:
diff changeset
90 file = null; cb = null;
79d492bce828 clean up
one
parents:
diff changeset
91 set("");
79d492bce828 clean up
one
parents:
diff changeset
92 return this;
79d492bce828 clean up
one
parents:
diff changeset
93 } finally {
79d492bce828 clean up
one
parents:
diff changeset
94 cb.flip();
79d492bce828 clean up
one
parents:
diff changeset
95 }
79d492bce828 clean up
one
parents:
diff changeset
96 lineno = 0;
79d492bce828 clean up
one
parents:
diff changeset
97 return this;
79d492bce828 clean up
one
parents:
diff changeset
98 }
79d492bce828 clean up
one
parents:
diff changeset
99
79d492bce828 clean up
one
parents:
diff changeset
100 }