from dataclasses import dataclass from enum import auto, Enum from typing import Any class Datatype(Enum): NONE = auto() NULL = auto() COMMENT = auto() STRING = auto() INTEGER = auto() FLOAT = auto() COMPLEX = auto() @dataclass class Data: type: Datatype value: Any @dataclass class Variable: name: str type: Datatype value: Data def __setattr__(self, name, value): if name == "value" and isinstance(value, Data): if self.type == value.type: object.__setattr__(self, name, value) else: raise ValueError( "Type inequality; cannot assign value of " f"type {value.type} to variable of type {self.type}" ) else: object.__setattr__(self, name, value) NONE_TYPE = Variable(None, Datatype.NONE, None) VAR_MATCH = { r"null": Datatype.NULL, r"\/\/.+": Datatype.COMMENT, r"\".+\"": Datatype.STRING, r"-?\d+\.?\d{0,}?\+\d+\.?\d{0,}?i": Datatype.COMPLEX, r"-?\d+\.\d{0,}": Datatype.FLOAT, r"-?\d+": Datatype.INTEGER, }