diff options
Diffstat (limited to 'neb/structs.py')
| -rw-r--r-- | neb/structs.py | 108 | 
1 files changed, 108 insertions, 0 deletions
| diff --git a/neb/structs.py b/neb/structs.py new file mode 100644 index 0000000..09807db --- /dev/null +++ b/neb/structs.py @@ -0,0 +1,108 @@ +from dataclasses import dataclass +from enum import Enum, auto +from typing import Any +from .typeclass import TypeEnum + +# tokens and types +# NOTE: this can probably be simplified +class TokenType(Enum): + +    OPEN_PAREN = auto() +    CLOSE_PAREN = auto() + +    EOF = auto() + +    # literals +    INT = auto() +    FLOAT = auto() +    STRING = auto() +    TRUE = auto() +    FALSE = auto() + +    # keywords +    IF = auto() +    FOR_COUNT = auto() +    DEF = auto() +    LAMBDA = auto() +    FUNC = auto() + +    # symbols +    SYMBOL = auto() + +    # types +    INT_TYPE = auto() +    FLOAT_TYPE = auto() +    NUMBER_TYPE = auto() +    STRING_TYPE = auto() +    ANY_TYPE = auto() +    LIST_TYPE = auto() +    LITERAL_TYPE = auto() +    BOOL_TYPE = auto() + +    MANY = auto() + +@dataclass +class Token: +    type_: TokenType +    text: str +    value: Any +    line: int + +    def __str__(self): +        return f"{self.type_.name} {self.text} {self.line}" + +class Literal: +    def __init__(self, value, type_=None): +        self.value = value +        if type_ is None: +            self.type_ = TypeEnum.ANY +        else: +            self.type_ = type_ +    def __str__(self): +        return f"{self.value}:literal" + +class Int(Literal): +    def __init__(self, value): +        super().__init__(value, TypeEnum.INT) +    def __str__(self): +        return f"{self.value}" + +class Float(Literal): +    def __init__(self, value): +        super().__init__(value, TypeEnum.FLOAT) +    def __str__(self): +        return f"{self.value}" + +class Bool(Literal): +    def __init__(self, value): +        super().__init__(value, TypeEnum.BOOL) +    def __str__(self): +        return f"#{str(self.value).lower()}" + +class String(Literal): +    def __init__(self, value): +        super().__init__(value, TypeEnum.STRING) +    def __str__(self): +        return f'"{repr(self.value)[1:-1]}"' + +class Type: +    def __init__(self, name): +        self.name = name +    def __str__(self): +        return self.name + +class Symbol: +    def __init__(self, name, line): +        self.name = name +        self.line = line +    def __str__(self): +        return f"'{self.name}" + +class List: +    def __init__(self, args, data=False): +        self.args = args +        self.data = data +        self.type_ = TypeEnum.LIST +    def __str__(self): +        return "(" +  " ".join(f"{arg}" for arg in self.args) + ")" + | 
