/
space_verse
/
LambdaLanguage
Обзор
Документация
Войти
/
space_verse
/
LambdaLanguage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/main.py
108 строк
3 KB
spacer
REMAKE: expression parsing
18 авг 2025, 03:00
18 авг 2025, 03:00
9baed1f
Код
Авторство
О чём код?
import logging import os import click from tokenizer.tokenizer import LambdaTokenizer from tokenizer.tokens import KEYWORDS, TOKENS_SPECIFICATION from parser.parser import Parser from parser.ast.codespace import CodespaceNode from parser.ast.codespace import NoneTypeImpl from interpreter import Interpreter log = logging.getLogger(__name__) ACCENT_COLOR = (235, 26, 60) VERSION = "v1.0" def cli_logo() -> str: return click.style( text="Lambda", fg=ACCENT_COLOR, ) + click.style( text="Language") def cli_version() -> str: accent_color = (25, 224, 69) return click.style( text=VERSION, fg=accent_color) def cli_greeting() -> str: return cli_logo() + " - " + cli_version() def invite_code() -> str: invite_message = click.style( text=">>> ", fg=ACCENT_COLOR) return invite_message @click.command() @click.argument("path", required=False) @click.option("-c", "--command") def main(path: str | None, command: str): tokenizer = LambdaTokenizer( keywords=KEYWORDS, tokens_specification=TOKENS_SPECIFICATION) codespace = CodespaceNode() code = "" if path: assert path[-3:] == ".la", "File should has '.la' extention" with open(path) as code_file: code = code_file.read() elif command: code = command else: click.echo(cli_greeting()) click.echo(invite_code(), nl=False) for code in click.get_text_stream("stdin"): code = code[:-1] match code: case "ls": os.system("dir" if os.name == "nt" else "ls") case "exit": exit() case "clear": click.clear() case _: tokens = tokenizer.tokenize( input=code, raise_on_empty=False) parser = Parser(tokens) statements = parser.parse() codespace.statements_update(statements=statements) interpreter = Interpreter(codespace) try: result = interpreter.eval(codespace) except Exception as err: print(repr(err).split('(')[0] + ':', err) else: if result != NoneTypeImpl: print(repr(result.value)) click.echo(invite_code(), nl=False) tokens = tokenizer.tokenize(input=code) parser = Parser(tokens) statements = parser.parse() codespace.statements_update(statements=statements) interpreter = Interpreter(codespace) interpreter.eval(codespace) if __name__ == "__main__": main()