Improved compiler error information
This commit is contained in:
parent
85d2fe67b6
commit
fea9d9d0fa
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue