Improved compiler error information
This commit is contained in:
parent
85d2fe67b6
commit
fea9d9d0fa
|
@ -66,4 +66,22 @@ class FileInfo:
|
||||||
class CompilerError(Exception):
|
class CompilerError(Exception):
|
||||||
|
|
||||||
def __init__(self, message: str, file_info: FileInfo):
|
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
|
from typing import Sequence
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
|
from .compiler_types import CompilerError
|
||||||
from .lexer import lexer
|
from .lexer import lexer
|
||||||
from .syntactical_analyzer import syntactical_analyzer
|
from .syntactical_analyzer import syntactical_analyzer
|
||||||
|
|
||||||
def compile(args: argparse.Namespace):
|
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:
|
if args.token_file:
|
||||||
for token in tokens:
|
for token in tokens:
|
||||||
args.token_file.write(str(token) + "\n")
|
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:
|
if args.syntax_file:
|
||||||
args.syntax_file.write(syntax.tree_str())
|
args.syntax_file.write(syntax.tree_str())
|
||||||
|
|
Loading…
Reference in New Issue