-
CommandLineParsers
- набор парсеров для разбора входной строки. Содержит главный методparse
, который запускает цепочку парсеров на входной строке для ее разбора. Возвращает в качестве результата разобранную строку, представленную в виде узла AST -Composition
.У нашего AST существуют следующие виды узлов:
Composition
- представляет цепочкуExpression
, соединенных оператором композиции. Иными словами - конвеер команд.Expression
-Assignment
илиApplication
.Assignment
- представляет оператор присваивания=
.Application
- представляет команду с аргументами.
Block
- представляет цепочкуUnit
.Unit
-Literal
илиSubstitution
.Literal
- последовательность символов, никак не интерпретируется.Substitution
- представляет оператор подстановки$
.
-
CommandLineInterpreter
- интерпретатор AST. Хранит в себе контекст выполнения -environment
, а также всю информацию о том, каким образом выполнять ту или иную команду. Таким образом, для того чтобы добавить новую команду, достаточно реализовать метод-обработчик для этой команды и поместить его вызов в методeval
обрабатывающийApplication
- узел.На данный момент реализованы следующие команды:
cat [FILE]
— вывести на экран содержимое файлов. Если ни одного аргумента не было передано, то читает данные из входного потока.echo
— вывести на экран свой аргумент (или аргументы).wc [FILE]
— вывести количество строк, слов и байт в каждом файле. Если ни одного аргумента не было передано, то читает данные из входного потока.pwd
— распечатать текущую директорию.grep
— выводит строки, отвечающие заданному регулярному выражению. Поддерживет следующие ключи:- -i — нечувствительность к регистру
- -w — поиск только слов целиком
- -A n — распечатать n строк после строки с совпадением
exit
— завершить работу программы.
Помимо этого, операторы
=
,$
и|
интерпретируются как полноценные команды с присущей им семантикой:variable = value
- оператор присваивания. Записывает значение с именем переменной.$variable
- оператор подстановки. Выполняет замену выражения на значение соответствующей переменной из контекста.command1 | command2
- оператор конвеера. Перенаправляет выводcommand1
на входcommand2
.
Если входная строка содержит неизвестную команду, то интерпретатор запустит внешний процесс для того, чтобы делегировать ее выполнение операционной системе.
-
Объект
Main
- точка входа в программу. В своем цикле он считывает очередную строку с консоли и пропускает ее через конвеер парсер-интерпретатор.