-
Notifications
You must be signed in to change notification settings - Fork 0
/
scanner.py
87 lines (70 loc) · 2.27 KB
/
scanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""
File: scanner.py
Editor: Leigh Stauffer
Project 10
A scanner for processing languages.
Modified version of scanner used in Chapter 13.
Includes methods get and stringUpToCurrentToken.
get returns Token.EOE when the string has been scanned.
No precondition on next.
"""
from tokens import Token
class Scanner(object):
EOE = ';' # end-of-expression
TAB = '\t' # tab
def __init__(self, sourceStr):
self.sourceStr = sourceStr
self.getFirstToken()
def hasNext(self):
return self.currentToken != Token.EOE
def get(self):
return self.currentToken
def next(self):
temp = self.currentToken
self.getNextToken()
return temp
def stringUpToCurrentToken(self):
return self.sourceStr[0:self.index + 1]
def getFirstToken(self):
self.index = 0
self.currentChar = self.sourceStr[0]
self.getNextToken()
def getNextToken(self):
self.skipWhiteSpace()
if self.currentChar.isdigit():
self.currentToken = Token(self.getInteger())
elif self.currentChar == Scanner.EOE:
self.currentToken = Token(';')
else:
self.currentToken = Token(self.currentChar)
self.nextChar()
def nextChar(self):
if self.index >= len(self.sourceStr) - 1:
self.currentChar = Scanner.EOE
else:
self.index += 1
self.currentChar = self.sourceStr[self.index]
def skipWhiteSpace(self):
while self.currentChar in (' ', Scanner.TAB):
self.nextChar()
def getInteger(self):
num = 0
while True:
num = num * 10 + int(self.currentChar)
self.nextChar()
if not self.currentChar.isdigit():
break
return num
def main():
"""A simple tester program."""
while True:
sourceStr = input("Enter an expression: ")
if sourceStr == "": break
scanner = Scanner(sourceStr)
token = scanner.get()
while token.getType() != Token.EOE:
print(token)
scanner.next()
token = scanner.get()
if __name__ == '__main__':
main()