feat(lexer): add comments and whitespace
This commit is contained in:
3
main.py
3
main.py
@@ -3,7 +3,8 @@ from src.token import Token
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
source: str = """(),{;:}.."""
|
source: str = """() {} +- += / /= // sefs + {, )
|
||||||
|
}:: *"""
|
||||||
lexer: Lexer = Lexer()
|
lexer: Lexer = Lexer()
|
||||||
tokens: list[Token] = lexer.process(source)
|
tokens: list[Token] = lexer.process(source)
|
||||||
print(tokens)
|
print(tokens)
|
||||||
|
|||||||
19
src/lexer.py
19
src/lexer.py
@@ -50,9 +50,6 @@ class Lexer:
|
|||||||
char: str = self.peek()
|
char: str = self.peek()
|
||||||
self.idx += 1
|
self.idx += 1
|
||||||
self.column += 1
|
self.column += 1
|
||||||
if char == "\n":
|
|
||||||
self.line += 1
|
|
||||||
self.column = 0
|
|
||||||
return char
|
return char
|
||||||
|
|
||||||
def match(self, expected: str) -> bool:
|
def match(self, expected: str) -> bool:
|
||||||
@@ -95,8 +92,6 @@ class Lexer:
|
|||||||
self.add_token(TokenType.PLUS_EQUAL if self.match("=") else TokenType.PLUS)
|
self.add_token(TokenType.PLUS_EQUAL if self.match("=") else TokenType.PLUS)
|
||||||
case "-":
|
case "-":
|
||||||
self.add_token(TokenType.MINUS_EQUAL if self.match("=") else TokenType.MINUS)
|
self.add_token(TokenType.MINUS_EQUAL if self.match("=") else TokenType.MINUS)
|
||||||
case "/":
|
|
||||||
self.add_token(TokenType.SLASH_EQUAL if self.match("=") else TokenType.SLASH)
|
|
||||||
case "*":
|
case "*":
|
||||||
self.add_token(TokenType.STAR_EQUAL if self.match("=") else TokenType.STAR)
|
self.add_token(TokenType.STAR_EQUAL if self.match("=") else TokenType.STAR)
|
||||||
case "=":
|
case "=":
|
||||||
@@ -107,6 +102,20 @@ class Lexer:
|
|||||||
self.add_token(TokenType.GREATER_EQUAL if self.match("=") else TokenType.GREATER)
|
self.add_token(TokenType.GREATER_EQUAL if self.match("=") else TokenType.GREATER)
|
||||||
case "<":
|
case "<":
|
||||||
self.add_token(TokenType.LESS_EQUAL if self.match("=") else TokenType.LESS)
|
self.add_token(TokenType.LESS_EQUAL if self.match("=") else TokenType.LESS)
|
||||||
|
case "/":
|
||||||
|
if self.match("/"):
|
||||||
|
while self.peek() != "\n" and not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
self.add_token(TokenType.COMMENT)
|
||||||
|
else:
|
||||||
|
self.add_token(TokenType.SLASH_EQUAL if self.match("=") else TokenType.SLASH)
|
||||||
|
case " " | "\r" | "\t" | "\n":
|
||||||
|
if char == "\n":
|
||||||
|
self.line += 1
|
||||||
|
self.column = 0
|
||||||
|
while self.peek().isspace() and not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
self.add_token(TokenType.WHITESPACE)
|
||||||
case _:
|
case _:
|
||||||
self.error("Unexpected character")
|
self.error("Unexpected character")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user