Перед запуском установите библиотеки:
pip install lark-parser==0.7.8
pip install parameterized
Запуск(из корневой директории): python main.py
Запуск тестов(из корневой директории): python -m unittest
Диаграмму классов можно найти по ссылке.
Shell
инкапсулирует в себе логику всего интерпретатора. Хранит:Environment
хранит состояние оболочки(переменные окружения и статус). Замечание: обращение к ранее неопределенной переменной считается ошибкой и прерывает исполнение текущей командыHandlersNet
инкапсурирует конвеер изHandler
-ов, занимающихся всей обработкой
Handler
- абстрактный элемент конвеера, выполняющий обработку в методеrun(request)
, после чего вызывается методonFinish(result)
, извещающий остальные звенья конвеераInputHandler
считывает данные из входного потокаSubstitutionHandler
парсит вход с помощьюSubstitutionParser
с целью выполнить подстановку(отператор$
) и обрато собирает все в строкуParserHandler
парсит строку с помощьюShellParser
и возвращает список командRunCommandsHandler
запускает команды последовательно, перенаправляя через PIPE(|
) потоки ввода и вывода для командOutputHandler
печатает результат в выходной поток
- Парсеры используют библеотеку lark. Используются трансформеры для преобразования AST в нужные данные:
SubstitutionTransformer
подменяет токен$name
на значение соответствующей переменной изEnvironment
ShellTransformer
преобразует AST в список команд, получая команды с помощьюCommandFactory
, которая по имени команды генерирует объект типаCommand
Command
- абстрактный класс команды. При создании указывается список строковых аргументов. Вызов команды происходит методомexecute
, определяющим потоки ввода и вывода для команды. Поддерживаются следующие команды:CatCommand
:cat [FILE]
- конкатинирует и выводит файлы, переданные в аргументах, если таких нет, перенаправляет поток входа дальше.EchoCommand
:echo [args]
- печатает переданные аргументы, игнорирует входной потокExitCommand
:exit
- завершает shell, игнорирует аргументы и входной поток. Выставляет вEnvironment
статус завершенияPwdCommand
:pwd
- печатает текущую директорию, игнорирует аргументы и входной потокWcCommand
:wc [FILE]
илиtext | wc
- считает количесво строк, слов и байт в файлах-аргументах(или во входном потоке, если нет аргументов). Выводит результат в формате:newlines = [N]; words = [N]; bytes = [N] [FILE]
, и если файлов несколько, последней строкой сумиирует результаты с меткойtotal
AssignmentCommand
:var = string
- присвоение значения в переменную, значением может быть только строка(не вызов команды)GrepCommand
- поиск шаблона в строке или файле.CdCommand
- изменяет текущую директорию.LsCommand
- список файлов в директории.CustomCommand
- при несовпадении имени команды с одиним из предыдущих вызывается команда, которая ищется вPATH
или файловой системе