Skip to content

mchernyavsky/scala-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

au-software-design-spring-2017

CLI

  • 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 - точка входа в программу. В своем цикле он считывает очередную строку с консоли и пропускает ее через конвеер парсер-интерпретатор.