Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
.value changing
#1
Hello! I'm trying to make a language and there's a problem.

Whenever I display the token, It displays something like this:
[TT_INT: 5]
But whenever I do the same thing while executing the code, I get a ErrorType:
Error:
Traceback (most recent call last): File "main.py", line 112, in <module> elif at == 'code': Executor(input('>>> ')).execute() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "main.py", line 85, in execute if tokens[0].value == 'print': ~~~~~~^^^ TypeError: 'NoneType' object is not subscriptable
Code:
class Token:
    def __init__(self, type, value=None):
        self.type = type
        self.value = value

    def __repr__(self):
        return f'{self.type}: {self.value}' if self.value != None else f'{self.type}'

class Executor:
    def __init__(self, text):
        self.text = text

    def last_number(self, index):
        if index == len(self.text) - 1: return True
        if self.text[index + 1].isdigit(): return False
        if self.text[index + 1] == '.': return False
        return True

    def clean(self, tokens):
        for token in tokens:
            if token.type == 'TT_STR': token.value = token.value.strip()

    def get_tokens(self):
        tokens = []
        save = ''

        for i in range(len(self.text)):
            char = self.text[i]
            save += char

            if char in ' \t':
                save = save[:len(save) - 2]
            elif save.count('\'') == 1 or save.count('"') == 1:
                pass
            elif save == '+':
                tokens.append(Token('TT_PLUS'))
                save = ''
            elif save == '-':
                tokens.append(Token('TT_MINUS'))
                save = ''
            elif save == '*':
                tokens.append(Token('TT_MULTI'))
                save = ''
            elif save == '/':
                tokens.append(Token('TT_DIVIDE'))
                save = ''
            elif save == '$':
                tokens.append(Token('TT_DOLLAR'))
                save = ''
            elif save == '=':
                tokens.append(Token('TT_EQUAL'))
                save = ''
            elif save == '(':
                tokens.append(Token('TT_LPAREN'))
                save = ''
            elif save == ')':
                tokens.append(Token('TT_RPAREN'))
                save = ''
            elif save == ',':
                tokens.append(Token('TT_COMMA'))
                save = ''
            elif save == '.':
                tokens.append(Token('TT_POINT'))
            elif save.count('\'') == 2 or save.count('"') == 2:
                tokens.append(Token('TT_STR', save))
                save = ''
            elif char.isdigit() and self.last_number(i) and not '.' in save:
                tokens.append(Token('TT_INT', eval(save)))
                save = ''
            elif char.isdigit() and self.last_number(i) and '.' in save:
                tokens.append(Token('TT_FLOAT', eval(save)))
                save = ''
            elif save in system.commands:
                tokens.append(Token('TT_COMMAND', save))
                save = ''
            elif save in system.variables:
                tokens.append(Token('TT_VARIABLE', save))
                save = ''

        return tokens

    def execute(self):
        tokens = self.clean(self.get_tokens())
        
        if tokens[0].value == 'print':
            print(tokens[1].type, tokens[1].value)
            if tokens[1].type == 'TT_DOLLAR': print(system.variables[tokens[2].value])
            else: print(tokens[1].value)
        elif tokens[0].value == 'var':
            system.variables | {tokens[1]: tokens[2]}

class System:
    def __init__(self):
        self.variables = {}

        self.commands = ['print']

    def error(self, text):
        print(f'\033[31m{text}\033[0m')
        exit()

    def warning(self, text):
        print(f'\033[33m{text}\033[0m')

system = System()

if __name__ == '__main__':
    at = input('AT: ')

    while True:
        if at == 'token': print(Executor(input('>>> ')).get_tokens())
        elif at == 'code': Executor(input('>>> ')).execute()
        else: break
Reply
#2
You have this error because the clean() method returns None, so tokens is None after the statement
tokens = self.clean(self.get_tokens())
« We can solve any problem by introducing an extra level of indirection »
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020