2022-10-21 14:40:17 -07:00
|
|
|
from prompt_toolkit import PromptSession
|
2022-10-21 17:05:25 -07:00
|
|
|
from prompt_toolkit import print_formatted_text as printf
|
2022-10-21 14:40:17 -07:00
|
|
|
from prompt_toolkit.formatted_text import FormattedText
|
|
|
|
from prompt_toolkit.formatted_text import to_plain_text
|
|
|
|
from pyparsing import exceptions as ppx
|
|
|
|
|
2022-11-11 17:20:59 -08:00
|
|
|
import lamb_engine
|
2022-10-20 11:02:49 -07:00
|
|
|
|
2022-11-11 18:19:38 -08:00
|
|
|
def main():
|
|
|
|
|
|
|
|
lamb_engine.utils.show_greeting()
|
|
|
|
|
|
|
|
|
|
|
|
r = lamb_engine.Runner(
|
|
|
|
prompt_session = PromptSession(
|
|
|
|
style = lamb_engine.utils.style,
|
|
|
|
lexer = lamb_engine.utils.LambdaLexer(),
|
|
|
|
key_bindings = lamb_engine.utils.bindings
|
|
|
|
),
|
|
|
|
prompt_message = FormattedText([
|
|
|
|
("class:prompt", "==> ")
|
|
|
|
])
|
|
|
|
)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
i = r.prompt()
|
|
|
|
|
|
|
|
# Catch Ctrl-C and Ctrl-D
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
printf("\n\nGoodbye.\n")
|
|
|
|
break
|
|
|
|
except EOFError:
|
|
|
|
printf("\n\nGoodbye.\n")
|
|
|
|
break
|
|
|
|
|
|
|
|
# Skip empty lines
|
|
|
|
if i.strip() == "":
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Try to run an input line.
|
|
|
|
# Catch parse errors and point them out.
|
|
|
|
try:
|
|
|
|
x = r.run(i)
|
|
|
|
except ppx.ParseException as e:
|
|
|
|
l = len(to_plain_text(r.prompt_session.message))
|
|
|
|
printf(FormattedText([
|
|
|
|
("class:err", " "*(e.loc + l) + "^\n"),
|
|
|
|
("class:err", f"Syntax error at char {e.loc}."),
|
|
|
|
("class:text", "\n")
|
|
|
|
]), style = lamb_engine.utils.style)
|
|
|
|
continue
|
|
|
|
except lamb_engine.nodes.ReductionError as e:
|
|
|
|
printf(FormattedText([
|
|
|
|
("class:err", f"{e.msg}\n")
|
|
|
|
]), style = lamb_engine.utils.style)
|
|
|
|
continue
|
|
|
|
|
|
|
|
printf("")
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|