Basic.Py
unknown
python
3 years ago
6.3 kB
7
Indexable
import basic while True: # lexer will go through the input character by character and break up the text into a list of Tokens. # A Token is a simpe object that has a type and optionly a value each Token comes from a small set of the code. # Basic.Py # This is creating a class called Token and we are using a function and init and then assigining it to #self = to it's self. we are then setting the self to it's value. # Assigning Intergers This includes Numbers,decimals, +,-,*,/,(,) # A float is a whole number or a decimal # TT stands for Token type. # Defining the Digits DIGITS = '0123456789' # Tokens TT_INTERGER = 'TT_INTERGER' # Number TT_FLOAT = 'TT_FLOAT' # Decimal Number TT_PLUS = 'TT_PLUS' # Additon + TT_MINUS = 'TT_MINUS' # Minus - TT_MULTIPLY = 'TT_MULTIPLY' # Muliplication * TT_DIVIDE = 'TT_DIVIDE' # Divison / TT_Left_parenthese = 'TT_Left_parenthese' # ( TT_Right_parenthese = 'TT_Right_parenthese' # ) class Token: def __init__(self,type, value = None): self.type = type_ self.value = value # If the token has the value this will print the type and the value # and if does not have a value it will just print the type. def __repr__(self): if self.value: return f'{self.type}:{self.value}' return f'{self.type}' # Error class class Error: def __init__(self, positon_start,positon_End,error_name,details): self.positon_End = positon_start self.positon_start = positon_End self.error_name = error_name self.details = details def as_string(self): result = f'{self.error_name}: {self.details}' result += f'File {self.positon_start.filename}, line {self.positon_start.index +1}' return result class InvaildCharacterError(Error): def __init__(self, positon_start, positon_End, details): super().__init__('Invaild Character', details) # Lexer class # Creating the class lexer creating a function for the lexer and the text, setting the text # equal to it's self, setting the positon equal to -1, and setting the current_character to None class Lexer: def __init__ (self,filename, text): self.filename = filename self.text = text self.positon = positon(-1, 0, -1, text) self.current_character = None self.advance() # calling advance # Defining a advance method which will advance to the next character in the text def advance(self): self.positon.advance(self.current_character) self.current_character = self.text[self.positon.index] if self.positon.index < length(self.text) else None # creating a make tokens method and making a empty list of tokens def make_tokens(self): token = [] # Assigning the variables created to characters while self.current_character != None: if self.current_character in ' \t': self.advance() elif self.current_character in DIGITS: tokens.append(self.make_number()) elif self.current_character == '+': tokens.append(token(TT_PLUS)) self.advance() elif self.current_character == '-': tokens.append(token(TT_MINUS)) self.advance() elif self.current_character == '*': tokens.append(token(TT_MULTIPLY)) self.advance() elif self.current_character == '/': tokens.append(token(TT_PLUS)) self.advance() elif self.current_character == '(': tokens.append(token(TT_Left_parenthese)) self.advance() elif self.current_character == ')': tokens.append(token(TT_Right_parenthese)) self.advance() else: positon_start = self.positon.copy character = self.current_character self.advance() return [], InvaildCharacterError(positon_start_start, self.positon, "'" + character + "'") # positon class class Positon: def __init__(self, index, line, colum, filename, filetext): self.index = index self.line = line self.colum = colum self.filename = filename self.filetext = filetext def advance(self, current_character): self.index +=1 self.colum +=1 if current_character == '\n': self.line +=1 self.colum = 0 return self def copy(self): return Positon(self.index, self.line, self.colum, self.filename, self.filetext) return tokens, None # if there are no dots then the number is a interger else it is a decimal def make_number(self): number_String = '' dot_count = 0 while self.current_character != None and self.current_character in DIGITS + '.': if self.current_character == '.': if dot_count == 1: break dot_count += 1 number_String += '.' else: number_String += self.current_character self.advance() if dot_count == 0: return Token(TT_INTERGER, int(number_String)) else: return Token(TT_FLOAT, float(number_String)) # Run function def Run(filename,text): lexer = Lexer(filename,text) tokens, Error = Lexer.make_tokens() return tokens, Error
Editor is loading...