При реализации интерпретатора для моего языка программирования я сначала думал о простой консоли, которая позволяет пользователю вводить некоторый код, который затем выполнен как автономная программа как оболочка.
Но существуют серьезные проблемы: Если каждая строка кода, которую вводит пользователь, обрабатывается как автономная программа, она должна пройти токенизатор и синтаксический анализатор и затем просто выполняется интерпретатором - что относительно функций затем?
Пример:
>> def x:
>> print("Blah")
>>
>> x()
Где функция хранится так, это можно назвать когда-либо снова?
Как интерактивная консоль может взять все вводимое как, очевидно, одна программа, не выполняя все много раз?
В большинстве этих языков используется синтаксический анализатор, который имеет своего рода «поток токенов», то есть синтаксический анализатор продолжает принимать токены (строку, символ, оператор и т. Д.) Из входного потока до тех пор, пока не получит полное выражение, затем он возвращает это проанализированное выражение, в котором оно может быть скомпилировано в байт-код или выполнено иным образом. Цикл REPL относительно прост в обработке с учетом этой структуры, поскольку синтаксический анализатор в основном запрашивает дополнительные данные, а вы даете пользователю подсказку и заставляете пользователя вводить дополнительные данные. Вам может потребоваться небольшая связь от анализатора к читателю, чтобы он отображал такие вещи, как подсказки о продолжении.
И Python, и Ruby выполняют операторы немедленно по порядку (объявление функции - это один оператор). Таким образом, вы можете выполнять код по операторам в интерпретаторе с таким же эффектом, как и в исходном файле.
Для Python выражение не завершено, пока не совпадут все скобки, скобки и т. Д. Это довольно легко обнаружить. Определение функции / класса не завершено, пока не будет введена полностью пустая строка. Затем компилятор компилирует введенное выражение или определение и запускает его.
Как и обычная функция, класс, модуль и т. Д., REPL имеет свою собственную локальную область видимости. Именно эта область видимости используется для переменных и определений, введенных в REPL.
Вы можете узнать больше об интерактивной консоли Python, прочитав документацию по модулю кода:
Модуль кода предоставляет возможности для реализации чтения- Циклы eval-print в Python. Включены два класса и вспомогательные функции, которые можно использовать для создания приложений, которые предоставляют интерактивную подсказку интерпретатора.