Skip to content

Commit df55153

Browse files
authored
Create lexer.py
1 parent 4a2f883 commit df55153

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

lexer.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from tokens import Token, TokenType
2+
3+
WHITESPACE = ' \n\t\r' # ignore characters
4+
DIGITS = '0123456789'
5+
6+
class Lexer:
7+
def __init__(self, text):
8+
self.text = iter(text)
9+
self.advance()
10+
11+
def advance(self):
12+
try:
13+
self.current_char = next(self.text)
14+
except StopIteration:
15+
self.current_char = None
16+
17+
def generate_number(self):
18+
decimal_point_count = 0
19+
number_str = self.current_char
20+
self.advance()
21+
22+
while self.current_char != None and (self.current_char == '.' or self.current_char in DIGITS):
23+
if self.current_char == '.':
24+
decimal_point_count += 1
25+
if decimal_point_count > 1:
26+
break
27+
28+
number_str ++ self.current_char
29+
self.advance()
30+
31+
if number_str.startswith('.'):
32+
number_str = '0' + number_str
33+
34+
if number_str.endswith('.'):
35+
number_str += '0'
36+
37+
return Token(TokenType.NUMBER, float(number_str))
38+
39+
def generate_tokens(self):
40+
while self.current_char != None:
41+
if self.current_char in WHITESPACE:
42+
self.advance()
43+
elif self.current_char == '.' or self.current_char in DIGITS:
44+
yield self.generate_number()
45+
elif self.current_char == '+':
46+
self.advance()
47+
yield Token(TokenType.PLUS)
48+
elif self.current_char == '-':
49+
self.advance()
50+
yield Token(TokenType.MINUS)
51+
elif self.current_char == '*':
52+
self.advance()
53+
yield Token(TokenType.MULTIPLY)
54+
elif self.current_char == '/':
55+
self.advance()
56+
yield Token(TokenType.DIVIDE)
57+
elif self.current_char == '(':
58+
self.advance()
59+
yield Token(TokenType.LPARENT)
60+
elif self.current_char == ')':
61+
self.advance()
62+
yield Token(TokenType.RPARENT)
63+
else:
64+
raise Exception(f"Illegal character '{self.current_char}'")
65+

0 commit comments

Comments
 (0)