Source code for cutile_basic.tokens
"""Token types and Token dataclass for the BASIC lexer."""
from dataclasses import dataclass
from enum import Enum, auto
[docs]
class TokenType(Enum):
# Literals
INTEGER = auto()
FLOAT = auto()
STRING = auto()
IDENTIFIER = auto()
# Keywords
LET = auto()
PRINT = auto()
INPUT = auto()
IF = auto()
THEN = auto()
ELSE = auto()
ENDIF = auto()
FOR = auto()
TO = auto()
STEP = auto()
NEXT = auto()
WHILE = auto()
WEND = auto()
GOTO = auto()
GOSUB = auto()
RETURN = auto()
DIM = auto()
REM = auto()
DATA = auto()
READ = auto()
END = auto()
STOP = auto()
AND = auto()
OR = auto()
NOT = auto()
MOD = auto()
OUTPUT = auto()
TILE = auto()
BID = auto()
# Operators
PLUS = auto() # +
MINUS = auto() # -
STAR = auto() # *
SLASH = auto() # /
CARET = auto() # ^
EQ = auto() # =
NEQ = auto() # <>
LT = auto() # <
GT = auto() # >
LE = auto() # <=
GE = auto() # >=
# Delimiters
LPAREN = auto() # (
RPAREN = auto() # )
COMMA = auto() # ,
SEMICOLON = auto() # ;
# Special
NEWLINE = auto()
EOF = auto()
COLON = auto() # : (statement separator)
KEYWORDS = {
"LET": TokenType.LET,
"PRINT": TokenType.PRINT,
"INPUT": TokenType.INPUT,
"IF": TokenType.IF,
"THEN": TokenType.THEN,
"ELSE": TokenType.ELSE,
"ENDIF": TokenType.ENDIF,
"FOR": TokenType.FOR,
"TO": TokenType.TO,
"STEP": TokenType.STEP,
"NEXT": TokenType.NEXT,
"WHILE": TokenType.WHILE,
"WEND": TokenType.WEND,
"GOTO": TokenType.GOTO,
"GOSUB": TokenType.GOSUB,
"RETURN": TokenType.RETURN,
"DIM": TokenType.DIM,
"REM": TokenType.REM,
"DATA": TokenType.DATA,
"READ": TokenType.READ,
"END": TokenType.END,
"STOP": TokenType.STOP,
"AND": TokenType.AND,
"OR": TokenType.OR,
"NOT": TokenType.NOT,
"MOD": TokenType.MOD,
"OUTPUT": TokenType.OUTPUT,
"TILE": TokenType.TILE,
"BID": TokenType.BID,
}
[docs]
@dataclass
class Token:
type: TokenType
value: str
line: int
col: int
def __repr__(self) -> str:
return f"Token({self.type.name}, {self.value!r}, L{self.line}:{self.col})"