main: improve REPL use (still broken though).

This commit is contained in:
Antoine Viallon 2024-01-11 18:50:02 +01:00
parent 6778a5e5c8
commit d2823f5abf
Signed by: aviallon
GPG key ID: 186FC35EDEB25716

View file

@ -1,16 +1,28 @@
from __future__ import annotations from __future__ import annotations
import argparse import argparse
import collections.abc import io
import sys import sys
import typing
from . import semantic, ir, optimizations from . import semantic, ir, optimizations
from .errors import CompilationError, CompilationWarning from .errors import CompilationError, CompilationWarning
from .lexer import Lexer, Tokens, Token from .lexer import Lexer, Tokens
from .logger import rootLogger, LogLevel from .logger import rootLogger, LogLevel
from .parser import Parser from .parser import Parser
class REPLInput(io.TextIOWrapper):
def __init__(self, buffer: typing.IO[bytes] = sys.stdin.buffer,
prompt_buffer: typing.IO[bytes] = sys.stdout.buffer):
super().__init__(buffer)
self._prompt_buffer = prompt_buffer
def readline(self, __size: int = -1) -> str:
self._prompt_buffer.write(b">> ")
return super().readline(__size)
def main(): def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--mock", action="store_true", help="Use default test input") parser.add_argument("--mock", action="store_true", help="Use default test input")
@ -32,12 +44,15 @@ def main():
// { let b: uint32; } // { let b: uint32; }
display(byte, 3) + 1; display(byte, 3) + 1;
""" """
if not args.mock:
data = sys.stdin.read().strip()
print("Source:\n", data) input_stream = REPLInput()
tokens: collections.abc.Iterator[Token] = \
Lexer(data, if args.mock:
print("Source:\n", data)
input_stream = io.StringIO(data)
tokens = \
Lexer(input_stream,
token_filter=lambda token: token.kind not in [Tokens.Blank, Tokens.Newline, Tokens.Comment]) token_filter=lambda token: token.kind not in [Tokens.Blank, Tokens.Newline, Tokens.Comment])
parser = Parser(tokens) parser = Parser(tokens)
@ -65,7 +80,7 @@ def main():
print(ir.IRRegister.get_registers()) print(ir.IRRegister.get_registers())
except CompilationError as e: except CompilationError as e:
e.location.source = data e.location.source = tokens.data
print(f"{e}\n{e.location.show_in_source()}", flush=True) print(f"{e}\n{e.location.show_in_source()}", flush=True)
if e.__cause__ is not None: if e.__cause__ is not None:
if rootLogger.level <= LogLevel.Debug: if rootLogger.level <= LogLevel.Debug: