1
3 package jminusminus;
4
5 import java.io.FileNotFoundException;
6 import java.util.Stack;
7 import java.util.Vector;
8
9
14
15 class LookaheadScanner {
16
17
18 private Scanner scanner;
19
20
21 private Vector<TokenInfo> backtrackingQueue;
22
23
24 private Vector<TokenInfo> nextQueue;
25
26
27 private Stack<Vector<TokenInfo>> queueStack;
28
29
30 public boolean isLookingAhead;
31
32
33 private TokenInfo previousToken;
34
35
36 private TokenInfo token;
37
38
46
47 public LookaheadScanner(String fileName) throws FileNotFoundException {
48 scanner = new Scanner(fileName);
49 backtrackingQueue = new Vector<TokenInfo>();
50 nextQueue = new Vector<TokenInfo>();
51 queueStack = new Stack<Vector<TokenInfo>>();
52 isLookingAhead = false;
53 }
54
55
58
59 public void next() {
60 previousToken = token;
61 if (backtrackingQueue.size() == 0) {
62 token = scanner.getNextToken();
63 } else {
64 token = backtrackingQueue.remove(0);
65 }
66 if (isLookingAhead) {
67 nextQueue.add(token);
68 }
69 }
70
71
77
78 public void recordPosition() {
79 isLookingAhead = true;
80 queueStack.push(nextQueue);
81 nextQueue = new Vector<TokenInfo>();
82 nextQueue.add(previousToken);
83 nextQueue.add(token);
84 }
85
86
90
91 public void returnToPosition() {
92 while (backtrackingQueue.size() > 0) {
93 nextQueue.add(backtrackingQueue.remove(0));
94 }
95 backtrackingQueue = nextQueue;
96 nextQueue = queueStack.pop();
97 isLookingAhead = !(queueStack.empty());
98
99 previousToken = backtrackingQueue.remove(0);
101 token = backtrackingQueue.remove(0);
102 }
103
104
109
110 public TokenInfo token() {
111 return token;
112 }
113
114
121
122 public TokenInfo previousToken() {
123 return previousToken;
124 }
125
126
131
132 public boolean errorHasOccured() {
133 return scanner.errorHasOccurred();
134 }
135
136
141
142 public String fileName() {
143 return scanner.fileName();
144 }
145
146 }
147