Jun-09-2025, 02:11 PM
Hello! I'm trying to make a language and there's a problem.
Whenever I display the token, It displays something like this:
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 subscriptableCode: 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
