Files
Plasma/lexer_token.py

96 lines
1.7 KiB
Python
Raw Normal View History

2025-10-13 06:55:35 +11:00
from enum import Enum
from typing import Any
class TokenType(Enum):
# Special tokens
EOF = "EOF"
ILLEGAL = "ILLEGAL"
# Data types
2025-10-13 21:05:03 +11:00
IDENT = "IDENT"
2025-10-13 06:55:35 +11:00
INT = "INT"
FLOAT = "FLOAT"
2025-10-15 07:48:38 +11:00
STRING = "STRING"
2025-10-13 06:55:35 +11:00
# Arithmetic symbols
PLUS = "PLUS"
MINUS = "MINUS"
ASTERISK = "ASTERISK"
SLASH = "SLASH"
POW = "POW"
MODULUS = "MODULUS"
2025-10-13 21:05:03 +11:00
# Assignment symbols
EQ = "EQ"
# Comparison symbols
LT = "<"
GT = ">"
EQ_EQ = "=="
LT_EQ = "<="
GT_EQ = ">="
2025-10-14 21:23:11 +11:00
NOT_EQ = "!="
2025-10-13 06:55:35 +11:00
# Symbols
LPAREN = "LPAREN"
RPAREN = "RPAREN"
LBRACKET = "LBRACKET"
RBRACKET = "RBRACKET"
2025-10-14 07:14:53 +11:00
LBRACE = "LBRACE"
RBRACE = "RBRACE"
2025-10-13 06:55:35 +11:00
COLON = "COLON"
2025-10-13 17:41:07 +11:00
SEMICOLON = "SEMICOLON"
COMMA = "COMMA"
2025-10-13 06:55:35 +11:00
2025-10-13 21:05:03 +11:00
# Keywords
2025-10-14 07:14:53 +11:00
RETURN = "RETURN"
IF = "IF"
UNLESS = "UNLESS"
TRUE = "TRUE"
FALSE = "FALSE"
2025-10-13 21:05:03 +11:00
# Typing
TYPE = "TYPE"
2025-10-13 06:55:35 +11:00
class Token:
def __init__(self, type: TokenType, literal: Any, line_no: int, position: int) -> None:
self.type = type
self.literal = literal
self.line_no = line_no
self.position = position
def __str__(self) -> str:
return f"token[{self.type} : {self.literal} : Line {self.line_no} : Position {self.position}]"
def __repr__(self) -> str:
2025-10-13 21:05:03 +11:00
return str(self)
KEYWORDS: dict[str, TokenType] = {
"return": TokenType.RETURN,
"if": TokenType.IF,
"unless": TokenType.UNLESS,
"true": TokenType.TRUE,
"false": TokenType.FALSE
2025-10-13 21:05:03 +11:00
}
ALT_KEYWORDS: dict[str, TokenType] = {
}
2025-10-14 07:14:53 +11:00
TYPE_KEYWORDS: list[str] = ["Int", "Float", "String", "Bool", "List", "Nil", "Func"]
2025-10-13 21:05:03 +11:00
def lookup_ident(ident: str) -> TokenType:
tt: TokenType | None = KEYWORDS.get(ident)
if tt is not None:
return tt
tt: TokenType | None = ALT_KEYWORDS.get(ident)
if tt is not None:
return tt
if ident in TYPE_KEYWORDS:
return TokenType.TYPE
return TokenType.IDENT