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