Из чего сделать интерпретатор командной строки?
ИКС = В/В + разбор + выполнение
Ввод
Непосредственная подмена input()
Унифицированный интерфейс (~/.inputrc)
- Возможности: история, достраивание, команды редактирования, …
Windows: pyreadline
cmd:
Основан на readline
- Заранее организованный mainloop/диалог
- Автоматическая генерация имён команд из имён функций-обработчиков
- Автоматическое достраивание (+собственное)
Разбор
Что мы уже знаем:
- Процедура разбора:
- лексический анализ
- синтаксический анализ
(необязательно) промежуточная интерпретация (например, построение байт-кода)
- непосредственная интерпретация
shlex — готовый лексический анализатор по типу shell
- Автоматическое разбиение строки на команду и параметры
Синтаксис shell — закавычивание, комментарии, роли различных символов
- Подсчёт входных строк, инструменты обработки ошибок
ply — python yacc/lex, лексический и синтаксический анализатор
- → можно навесить интерпретацию
сконвертированы из примеров для yacc
Свойства:
- Синтаксис lex и yacc
- ⇒ LALR(1) и shift/reduce (aka перенос/свёртка)
- Лексемы:
- Литералы (просто символы)
- Заданные группы (комментарии и разделители)
- Токены — регулярные выражения
- Токены, распознаваемые функциями (регулярные выражения в docstrings)
- Синтаксис:
- Правило — это функция с БНФ в docstrings
- Произвольная манипуляция соответствующими значениями нетерминальных символов в коде функции
- Нумерация строк и позиции в строке, обработка ошибок, и т. п.
Кстати: pep-0617
- Общая идея: разбиение на лексемы не нужно, интерпретируются сразу выражения, на языке, подобном БНФ.
по мощности регулярные < PEG < контекстно-свободные (например, LR)
- нет неоднозначности
- проще оформлять (в т. ч. средствами Python, например, перегрузкой операций)