Files
highground/token.py
2025-09-02 20:41:17 +10:00

109 lines
2.4 KiB
Python

from enum import Enum
class TokenType(Enum):
INTEGER = 1
DOUBLE = 2
STRING = 3
CHAR = 4
BOOLEAN = 5
VARIABLE = 8
IF = 9
ELSE = 10
WHILE = 11
LET = 12
END = 13
ADD = 14
SUBTRACT = 15
MULTIPLY = 16
DIVIDE = 17
SET = 18
EQUAL = 19
GREATER = 20
LESSER = 21
PARAMOPEN = 22
PARAMCLOSE = 23
ROOT = 24
UNKNOWN = 0
class Token:
def __init__(self, tok: str, isroot = False):
self.value = tok
if isroot:
self.type = TokenType.ROOT
else:
self.type = get_type(tok)
def __repr__(self) -> str:
return f"Token(type={self.type.name}, value='{self.value}')"
type tokenlist = list[Token]
def get_type(process: str) -> TokenType:
# Keywords
match process:
case "let":
return TokenType.LET
case "if":
return TokenType.IF
case "else":
return TokenType.ELSE
case "while":
return TokenType.WHILE
case "true" | "false":
return TokenType.BOOLEAN
case "end":
return TokenType.END
case "+":
return TokenType.ADD
case "-":
return TokenType.SUBTRACT
case "*":
return TokenType.MULTIPLY
case "/":
return TokenType.DIVIDE
case "=":
return TokenType.SET
case "==":
return TokenType.EQUAL
case ">":
return TokenType.GREATER
case "<":
return TokenType.LESSER
case "(":
return TokenType.PARAMOPEN
case ")":
return TokenType.PARAMCLOSE
# String/Char Literals
if len(process) >= 2:
if process.startswith('"') and process.endswith('"'):
return TokenType.STRING
if process.startswith("'") and process.endswith("'") and len(process) == 3:
return TokenType.CHAR
# Numeric Literals
if '.' in process:
try:
float(process)
return TokenType.DOUBLE
except ValueError:
pass
else:
try:
int(process)
return TokenType.INTEGER
except ValueError:
pass
# Identifiers (Variables/Functions)
if process and (process[0].isalpha() or process[0] == '_') and all(c.isalnum() or c == '_' for c in process):
return TokenType.VARIABLE
return TokenType.UNKNOWN