Spaces:
Running
Running
import re | |
from typing import List, Tuple | |
Token = Tuple[str, str] | |
RESERVED = { | |
"int", "float", "boolean", | |
"ACTIVATE_SENSOR", "ACTIVATE_ALARM", "BREAK", "CALIBRATE", "CHARGE_BATTERY", "CHECK_BATTERY", | |
"CLOSE_DOOR", "CONTINUE", "COPY_FILE", "DEACTIVATE_ALARM", "DEACTIVATE_SENSOR", | |
"DECREASE_SPEED", "DELETE_FILE", "DOWNLOAD", "ELSE", "FALSE", "FOR", "IF", "INCREASE_SPEED", | |
"INIT", "LOCK", "LOG", "LOW_BATTERY", "MOVE_BACKWARD", "MOVE_FORWARD", "MOVE_TO", "NULL", | |
"OPEN_DOOR", "PAUSE", "PRINT", "READ_SENSOR", "REBOOT", "RENAME_FILE", "RESET", "RESUME", | |
"REVERSE", "ROTATE", "SAVE_FILE", "SCAN", "SET_SPEED", "SHUTDOWN", "SHUT_OFF", "START", | |
"STOP", "STOP_IMMEDIATELY", "THEN", "TOGGLE_LIGHT", "TRUE", "TURN_DOWN", "TURN_LEFT", | |
"TURN_RIGHT", "TURN_UP", "UNLOCK", "UPLOAD", "UPLOAD_FILE", "WAIT", "WHILE", "SET" | |
} | |
TOKEN_SPEC = [ | |
("COMMENT", r"//[^\n]*"), | |
("STRING", r'"[^"\n]*"'), | |
("FLOAT", r'\d+\.\d+'), | |
("INT", r'\d+'), | |
("ASSIGN", r'='), | |
("PLUS", r'\+'), | |
("MINUS", r'-'), | |
("MULTIPLY", r'\*'), | |
("DIVIDE", r'/'), | |
("EQUAL", r'=='), | |
("NOT_EQUAL", r'!='), | |
("GREATER", r'>'), | |
("LESS", r'<'), | |
("OPEN_PAREN", r'\('), | |
("CLOSE_PAREN", r'\)'), | |
("OPEN_BRACE", r'\{'), | |
("CLOSE_BRACE", r'\}'), | |
("SEMICOLON", r';'), | |
("COLON", r':'), | |
("COMMA", r','), | |
("NEWLINE", r'\n'), | |
("SKIP", r'[ \t\r]+'), | |
("IDENTIFIER", r'[a-zA-Z_][a-zA-Z0-9_]*'), | |
("MISMATCH", r'.') | |
] | |
TOK_REGEX = '|'.join(f'(?P<{name}>{pattern})' for name, pattern in TOKEN_SPEC) | |
token_re = re.compile(TOK_REGEX) | |
def lexer(code: str) -> List[Token]: | |
tokens = [] | |
for match in token_re.finditer(code): | |
kind = match.lastgroup | |
value = match.group() | |
if kind in ("NEWLINE", "SKIP", "COMMENT"): | |
continue | |
elif kind == "IDENTIFIER": | |
if value in RESERVED: | |
tokens.append((value, value)) | |
else: | |
tokens.append(("IDENTIFIER", value)) | |
elif kind == "MISMATCH": | |
raise RuntimeError(f"Token no reconocido: {value}") | |
else: | |
tokens.append((kind, value)) | |
return tokens |