diff options
Diffstat (limited to 'tokens.py')
| -rw-r--r-- | tokens.py | 68 | 
1 files changed, 43 insertions, 25 deletions
| @@ -16,25 +16,36 @@ class NebType(Enum):      SYMBOL = auto()      def __str__(self): -        return ":" + self.name.lower() +        return self.name.lower() -@dataclass -class NebToken: -    type_: NebType +class NebBaseType: -class NebLiteral(NebToken): +    def __init__(self, type_name, type_): +        self.type_name = type_name +        self.type_ = type_ -    def __init__(self, type_, value): -        super().__init__(type_) +    def __str__(self): +        return f":{self.type_name}" + +class NebAny(NebBaseType): +    def __init__(self, type_name, type_): +        super().__init__("any", NebType.ANY) + +class NebLiteral(NebBaseType): + +    def __init__(self, type_name, type_, value): +        super().__init__(type_name, type_)          self.value = value      def __str__(self):          fixed = str(self.value) -        if self.type_ == NebType.BOOL: +        #if self.type_ == NebBaseType.BOOL: +        if isinstance(self, NebBool):              fixed = f"#{str(self.value).lower()}" -        elif self.type_ == NebType.STRING: +        #elif self.type_ == NebBaseType.STRING: +        elif isinstance(self, NebString):              fixed = f'"{self.value}"' -        return f"{fixed} <{self.type_}>" +        return f"{fixed} <:{self.type_name}>"  class NebSeparator():      pass @@ -47,19 +58,19 @@ class NebClose(NebSeparator):      def __str__(self):          return ")" -class NebSymbol(NebToken): +class NebSymbol(NebBaseType):      def __init__(self, name): -        super().__init__(NebType.SYMBOL) +        super().__init__("symbol", NebType.SYMBOL)          self.name = name      def __str__(self):          return f"'{self.name}" -class NebExpression(NebToken): +class NebExpression(NebBaseType):      def __init__(self, symbol, args): -        super().__init__(NebType.EXPR) +        super().__init__("expr", NebType.EXPR)          self.symbol = symbol          self.args = args          self.returns = None @@ -71,7 +82,7 @@ class NebExpression(NebToken):          out = f"({self.symbol}"          for arg in self.args:              out += f" {arg}" -        out += f") <{self.type_}> -> <{self.out_sig()}>" +        out += f") <:{self.type_}> -> <{self.out_sig()}>"          return out      def in_sig(self): @@ -83,9 +94,6 @@ class NebExpression(NebToken):          else:              return ":" + self.returns.lower() -    def sig(self): -        return (self.in_sig() + " > " + self.out_sig()).strip() -  class NebFunction():      def __init__(self, name, args, returns): @@ -93,12 +101,22 @@ class NebFunction():          self.args = args          self.returns = returns -    def in_sig(self): -        return " ".join(":" + x.name.lower() for x in self.args) -     -    def out_sig(self): -        return ":" + self.returns.lower() +class NebBool(NebLiteral): +    def __init__(self, value): +        super().__init__("bool", NebType.BOOL, value) + +class NebString(NebLiteral): +    def __init__(self, value): +        super().__init__("string", NebType.STRING, value) + +class NebNumber(NebLiteral): +    pass + +class NebInt(NebNumber): +    def __init__(self, value): +        super().__init__("int", NebType.INT, value) -    def sig(self): -        return (self.in_sig() + " > " + self.out_sig()).strip() +class NebFloat(NebNumber): +    def __init__(self, value): +        super().__init__("float", NebType.FLOAT, value) | 
