VARIABLESSSS
This commit is contained in:
20
lexer.py
20
lexer.py
@@ -1,4 +1,4 @@
|
||||
from lexer_token import Token, TokenType
|
||||
from lexer_token import Token, TokenType, lookup_ident
|
||||
from typing import Any
|
||||
|
||||
|
||||
@@ -36,6 +36,9 @@ class Lexer:
|
||||
def __is_digit(self, char: str) -> bool:
|
||||
return "0" <= char and char <= "9"
|
||||
|
||||
def __is_letter(self, char: str) -> bool:
|
||||
return "a" <= char and char <= "z" or "A" <= char and char <= "Z" or char == "_"
|
||||
|
||||
def __read_number(self) -> Token:
|
||||
start_pos: int = self.position
|
||||
dot_count: int = 0
|
||||
@@ -61,6 +64,13 @@ class Lexer:
|
||||
else:
|
||||
return self.__new_token(TokenType.FLOAT, float(output))
|
||||
|
||||
def __read_identifier(self) -> str:
|
||||
position = self.position
|
||||
while self.current_char is not None and (self.__is_letter(self.current_char) or self.current_char.isalnum()):
|
||||
self.__read_char()
|
||||
|
||||
return self.source[position:self.position]
|
||||
|
||||
def next_token(self) -> Token:
|
||||
tok: Token = None
|
||||
|
||||
@@ -79,6 +89,8 @@ class Lexer:
|
||||
tok = self.__new_token(TokenType.POW, self.current_char)
|
||||
case "%":
|
||||
tok = self.__new_token(TokenType.MODULUS, self.current_char)
|
||||
case "=":
|
||||
tok = self.__new_token(TokenType.EQ, self.current_char)
|
||||
case "(":
|
||||
tok = self.__new_token(TokenType.LPAREN, self.current_char)
|
||||
case ")":
|
||||
@@ -98,6 +110,12 @@ class Lexer:
|
||||
case None:
|
||||
tok = self.__new_token(TokenType.EOF, "")
|
||||
case _:
|
||||
if self.__is_letter(self.current_char):
|
||||
literal: str = self.__read_identifier()
|
||||
tt: TokenType = lookup_ident(literal)
|
||||
tok = self.__new_token(tt, literal)
|
||||
return tok
|
||||
|
||||
if self.__is_digit(self.current_char):
|
||||
tok = self.__read_number()
|
||||
return tok
|
||||
|
||||
Reference in New Issue
Block a user