7
|
1 package plparser;
|
|
2
|
|
3 import java.io.FileReader;
|
|
4 import java.io.InputStream;
|
|
5 import java.io.InputStreamReader;
|
|
6 import java.util.Iterator;
|
|
7
|
|
8 public abstract class PLScannerImpl<Node> implements PLScanner<Node> {
|
|
9
|
|
10 public int lineno;
|
|
11 public Token<Node> nextToken;
|
|
12 public Dictionary<Node> dict;
|
|
13 public PLScanner<Node> next;
|
|
14 public InputStreamReader file;
|
|
15 public String filename;
|
|
16 public PLScanner<Node> prev;
|
|
17 public Token<Node> nullToken;
|
|
18 public String prompt;
|
|
19 public static final int BufferSize = 4096;
|
|
20
|
11
|
21 /**
|
|
22 * Construtor for push Scanner
|
|
23 * @param p previous scanner
|
|
24 * @param dict dictionary
|
|
25 * @param nullToken shared null token
|
|
26 */
|
|
27 public PLScannerImpl(PLScanner<Node> p,
|
|
28 Dictionary<Node> dict, Token<Node> nullToken) {
|
|
29 this.prev = p;
|
|
30 this.dict = dict;
|
|
31 this.nullToken = nullToken;
|
7
|
32 }
|
|
33
|
11
|
34
|
|
35 public PLScannerImpl() {
|
|
36 this.dict = new Dictionary<Node>();
|
|
37 this.nullToken = new Token<Node>("",TokenID.NULL);
|
|
38 this.prev = null;
|
7
|
39 }
|
|
40
|
|
41
|
|
42 public PLScanner<Node> popScanner() {
|
|
43 return prev;
|
|
44 }
|
|
45
|
|
46 private PLScanner<Node> findFileName() {
|
|
47 for(PLScanner<Node> s = this;s!=null ; s = s.prev()) {
|
|
48 if (s.filename()!=null) return s;
|
|
49 }
|
|
50 return null;
|
|
51 }
|
|
52 /*
|
|
53 * Read From String
|
|
54 */
|
|
55
|
|
56 public void error(String err) {
|
|
57 PLScanner<Node> s = findFileName();
|
|
58 if (s!=null) {
|
|
59 System.err.print(s.filename()+":"+s.lineno()+": ");
|
|
60 }
|
|
61 System.err.println("error: "+err);
|
|
62 }
|
|
63
|
|
64 public Iterable<Token<Node>> scanToken(String exp) {
|
|
65 set(exp);
|
|
66 return iterator();
|
|
67 }
|
|
68
|
|
69 public Iterable<Token<Node>> scanToken(FileReader file) {
|
|
70 set(file);
|
|
71 return iterator();
|
|
72 }
|
|
73
|
|
74 private Iterable<Token<Node>> iterator() {
|
|
75 return new Iterable<Token<Node>>() {
|
|
76 public Iterator<Token<Node>> iterator() {
|
|
77 return new Iterator<Token<Node>>() {
|
|
78 public boolean hasNext() {
|
|
79 return hasRemaining();
|
|
80 }
|
|
81 public Token<Node> next() {
|
|
82 return nextToken();
|
|
83 }
|
|
84 public void remove() {
|
|
85 }
|
|
86 };
|
|
87 }
|
|
88 };
|
|
89 }
|
|
90
|
|
91 public PLScanner<Node> setFile(InputStream newfile, String prompt) {
|
|
92 this.filename = newfile.toString();
|
|
93 nextToken = nullToken;
|
|
94 this.prompt = prompt;
|
|
95 set(new InputStreamReader(newfile));
|
|
96 return this;
|
|
97 }
|
|
98
|
|
99 @Override
|
|
100 public String filename() {
|
|
101 return filename;
|
|
102 }
|
|
103
|
|
104 @Override
|
|
105 public int lineno() {
|
|
106 return lineno;
|
|
107 }
|
|
108
|
|
109 @Override
|
|
110 public PLScanner<Node> prev() {
|
|
111 return prev;
|
|
112 }
|
|
113
|
11
|
114 public Dictionary<Node> dictionary() {
|
|
115 return dict;
|
|
116 }
|
|
117
|
7
|
118 } |