Skip to content

Commit

Permalink
Improve error details
Browse files Browse the repository at this point in the history
  • Loading branch information
RashikaKarki committed May 28, 2021
1 parent 3c71e8b commit ffc66ad
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 22 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# Storm
A Compiler made from scratch using Python


Storm is a basic programming language implemented with the help of Python.
16 changes: 11 additions & 5 deletions src/Storm/error.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
class Error:
def __init__(self, error_name, error_details = None) -> None:
def __init__(self, file_name, line_number, error_name, error_details = None) -> None:
self.file_name = file_name
self.line_number = line_number
self.error_name = error_name
self. error_details = error_details

def __repr__(self) -> str:
if self.error_details != None: return f'{self.error_name} \n Details : {self.error_details}'
return f'{self.error_name}'
if self.file_name != None:
error_info = f'{self.error_name} in line {self.line_number} of {self.file_name}'
else:
error_info = f'{self.error_name} in line {self.line_number}'
if self.error_details != None: return f'{error_info}\n Details : {self.error_details}'
return f'{error_info}'


class ErrorIllegalChar(Error):
def __init__(self, details) -> None:
super().__init__('Illegal Character Deteted', details)
def __init__(self,file_name, line_number, details) -> None:
super().__init__(file_name, line_number,'Illegal Character Detected', details)

26 changes: 10 additions & 16 deletions src/Storm/lexer.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,28 @@
from Storm import token


from Storm.type import *
from Storm.type import get_number_type, get_type
from Storm.token import Token
from Storm.type import get_type
from Storm.error import *
from Storm.error import ErrorIllegalChar
from Storm.position import Position

class Lexer:
def __init__(self, text) -> None:
def __init__(self, text, file_name = None) -> None:
self.file_name = file_name
self.text = text
self.pos = -1
self.pos = Position(-1, 1, -1, self.file_name, self.text)
self.cur_char = None

def __increment(self):
self.pos += 1
self.cur_char = self.text[self.pos] if self.pos < len(self.text) else None

def __decrement(self):
self.pos -= 1
self.cur_char = self.text[self.pos] if self.pos < 0 else None
self.pos.increment(self.cur_char)
self.cur_char = self.text[self.pos.index] if self.pos.index < len(self.text) else None

def make_tokens(self):
list_tokens = []
self.__increment()
while self.cur_char != None:
if self.cur_char in " \t":
if self.cur_char in " \t\n":
self.__increment()
else:
token_type = get_type(self.cur_char)
Expand All @@ -34,11 +32,8 @@ def make_tokens(self):
elif token_type == 'DIGIT':
token_type, value = self.make_numbers()
list_tokens.append(Token(token_type, value))
self.__increment()
else:
return [], ErrorIllegalChar(self.cur_char)


return [], ErrorIllegalChar(self.file_name, self.pos.line_number, f'Invalid character \'{self.cur_char}\' found')
return list_tokens, None

def make_numbers(self):
Expand All @@ -53,7 +48,6 @@ def make_numbers(self):
elif char_type == "DIGIT":
num_str += str(self.cur_char)
else:
self.__decrement()
break
self.__increment()
return get_number_type(num_str), num_str
Expand Down
18 changes: 18 additions & 0 deletions src/Storm/position.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Position:
def __init__(self, index, line_number, column, file_name, file_content) -> None:
self.index = index
self.line_number = line_number
self.column = column
self.file_name = file_name
self.file_content = file_content

def increment(self, cur_char):
self.index += 1
self.column += 1
if cur_char == "\n":
self.line_number += 1
self.column = 0
return self

def copy(self):
return Position(self.index, self.line_number, self.line_number, self.file_name, self.file_content)

0 comments on commit ffc66ad

Please sign in to comment.