main: improve REPL use (still broken though).
This commit is contained in:
parent
6778a5e5c8
commit
d2823f5abf
1 changed files with 23 additions and 8 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue