1
3 package jminusminus;
4
5 import java.io.FileNotFoundException;
6 import java.util.Stack;
7 import java.util.Vector;
8
9
14 class LookaheadScanner {
15 private Scanner scanner;
17
18 private Vector<TokenInfo> backtrackingQueue;
20
21 private Vector<TokenInfo> nextQueue;
23
24 private Stack<Vector<TokenInfo>> queueStack;
26
27 public boolean isLookingAhead;
29
30 private TokenInfo previousToken;
32
33 private TokenInfo token;
35
36
42 public LookaheadScanner(String fileName) throws FileNotFoundException {
43 scanner = new Scanner(fileName);
44 backtrackingQueue = new Vector<TokenInfo>();
45 nextQueue = new Vector<TokenInfo>();
46 queueStack = new Stack<Vector<TokenInfo>>();
47 isLookingAhead = false;
48 }
49
50
53 public void next() {
54 previousToken = token;
55 if (backtrackingQueue.size() == 0) {
56 token = scanner.getNextToken();
57 } else {
58 token = backtrackingQueue.remove(0);
59 }
60 if (isLookingAhead) {
61 nextQueue.add(token);
62 }
63 }
64
65
70 public void recordPosition() {
71 isLookingAhead = true;
72 queueStack.push(nextQueue);
73 nextQueue = new Vector<TokenInfo>();
74 nextQueue.add(previousToken);
75 nextQueue.add(token);
76 }
77
78
81 public void returnToPosition() {
82 while (backtrackingQueue.size() > 0) {
83 nextQueue.add(backtrackingQueue.remove(0));
84 }
85 backtrackingQueue = nextQueue;
86 nextQueue = queueStack.pop();
87 isLookingAhead = !(queueStack.empty());
88
89 previousToken = backtrackingQueue.remove(0);
91 token = backtrackingQueue.remove(0);
92 }
93
94
99 public TokenInfo token() {
100 return token;
101 }
102
103
108 public TokenInfo previousToken() {
109 return previousToken;
110 }
111
112
117 public boolean errorHasOccured() {
118 return scanner.errorHasOccurred();
119 }
120
121
126 public String fileName() {
127 return scanner.fileName();
128 }
129 }
130