Files
Gwendolyn/gwendolyn/funcs/other/roll/lexer.py
Nikolaj 2f4e606fbf
2024-10-30 15:31:46 +01:00

49 lines
1.3 KiB
Python

from string import ascii_letters, digits
from rply import LexerGenerator
VALID_CHARACTERS = ascii_letters[:3]+ascii_letters[4:]+"_"+digits
TOKENS = [
("ROLL_DIE", r"d"),
("ROLL_KEEP_HIGHEST", r"kh"),
("ROLL_KEEP_LOWEST", r"kl"),
("ROLL_MIN", r"min"),
("ROLL_MAX", r"max"),
("ROLL_EXPLODE", r"!"),
("SYMBOL_LE", r"\<\="),
# ("SYMBOL_GE", r"\>\="),
("SYMBOL_EQUALS", r"\="),
("SYMBOL_ARROW", r"\-\>"),
("SYMBOL_BACKSLASH", r"\\"),
("SYMBOL_LPARENS", r"\("),
("SYMBOL_RPARENS", r"\)"),
("SYMBOL_PLUS", r"\+"),
("SYMBOL_MINUS", r"\-"),
("SYMBOL_TIMES", r"\*"),
("SYMBOL_DIVIDE", r"\/"),
("KEYWORD_LET", r"let"),
("KEYWORD_IN", r"in"),
("KEYWORD_IF", r"if"),
("KEYWORD_THEN", r"then"),
("KEYWORD_ELSE", r"else"),
("INT", r"\d+"),
("ID", f"[{ascii_letters}][{VALID_CHARACTERS}]*")
]
class Lexer():
def __init__(self):
self.lexer = LexerGenerator()
def _add_tokens(self):
for token in TOKENS:
self.lexer.add(*token)
self.lexer.ignore(r"\s+")
def get_lexer(self):
self._add_tokens()
return self.lexer.build()