Improved compiler error information

This commit is contained in:
Kyler 2024-03-06 22:31:18 -07:00
parent 85d2fe67b6
commit fea9d9d0fa
2 changed files with 28 additions and 3 deletions

View File

@ -66,4 +66,22 @@ class FileInfo:
class CompilerError(Exception):
def __init__(self, message: str, file_info: FileInfo):
super().__init__(message, file_info)
new_message = message
if file_info is not None:
new_message += (
f"\nIn file {file_info.filename} at line {file_info.line} "
)
if file_info.lines:
new_message += f"to line {file_info.line + file_info.lines}"
with open(file_info.filename, 'r') as file:
new_message += ''.join(
file.readlines()[
file_info.line-1:file_info.line + file_info.lines])
else:
new_message += f"col {file_info.col}\n\n"
with open(file_info.filename, 'r') as file:
new_message += file.readlines()[file_info.line-1]
new_message += ' ' * (
file_info.col - 1) + '^' * file_info.length
super().__init__(new_message)

View File

@ -4,17 +4,24 @@
from typing import Sequence
import argparse
from .compiler_types import CompilerError
from .lexer import lexer
from .syntactical_analyzer import syntactical_analyzer
def compile(args: argparse.Namespace):
tokens = lexer(args.input_file.read(), args.input_file.name)
try: tokens = lexer(args.input_file.read(), args.input_file.name)
except CompilerError as e:
print(type(e).__name__+':', e)
return
if args.token_file:
for token in tokens:
args.token_file.write(str(token) + "\n")
syntax = syntactical_analyzer(tokens)
try: syntax = syntactical_analyzer(tokens)
except CompilerError as e:
print(type(e).__name__+':', e)
return
if args.syntax_file:
args.syntax_file.write(syntax.tree_str())