Интерпретатор python-подобного языка
Интерпретатор читает ввод построчно, строит AST и с его помощью выполняет инструкции, вызывает пользовательские и встроенные функции, вычисляет выражения.
Поддерживаются:
- выражения с арифметическими операторами
+, -, *, /, %
, логическими операторами!, &&, ||
(без поддержки Short-Curcuit Evaluation), операторами сравнения==, <
, с вызовами функций - выполнение инструкций печати (
print a, b, c
), присваивания переменных (x = 12 + 2
), управляющих инструкцийif
,if .. else
,while
,do .. while
,return
- поддержка встроенных функций
sin(x)
иrand(min, max)
и объявления пользовательских функций - типы данных Boolean, Number, String и специальный тип данных Error для обработки ошибок вычислений.
Операторы "&&", "||" реализованы не полностью: не реализован принцип Short-Curcuit Evaluation, который требует не вычислять правое подвыражение, если результат логического выражения однозначно известен после вычисления левого. Например, в выражении true || func()
в этом интерпретаторе функция func()
будет вызвана, а в большинстве промышленных языков — нет.
Примеры ввода-вывода
Ввод:
print 21 + 13 - (1.12 * 2 - 1.51 / 2)
x = 10
y = 12.2
print x * y
prnt x * y
while x < 100
x = x + 12
end
print x
Вывод:
32.515
122
Error: Syntax error at (5,6)
106
Более сложный пример — вычисление квадратного корня методом Ньютона
function sqrt(x)
if x < 0
return 0
end
root = 1
mustContinue = false
do
newRoot = 0.5 * (root + x / root)
mustContinue = !(newRoot == root)
root = newRoot
while mustContinue end
return root
end
print "sqrt(2) = ", sqrt(2)
Вывод:
sqrt(2) = 1.5
Карта проекта
CLexer, CParser
выполняют лексический и синтаксический анализ, при этомCParser
сам не содержит алгоритма разбора — вместо этого он оборачивает движок, сгенерированный генератором парсеров Lemon и расположенный в файлахGrammar.h
иGrammar.cpp
AST.h
иAST.cpp
содержат классы узлов абстрактного синтаксического дереваCInterpreter
реализует драйвер интерпретатораCInterpreterContext
,CValue
,CVariablesScope
реализуют вычисление AST, то есть интерпретацию исходного языка- классы
CStringPool
,SToken
являются вспомогательными
Системные требования
- Для ОС Ubuntu: установите пакет
lemon
- Для ОС Windows: если вы хотите перегенерировать грамматику, соберите Lemon из исходных кодов (hwaci.com). Исходники Lemon состоят всего из двух файлов,
lemon.c
иlempar.c
. Используйте Visual Studio 2015 или другой компилятор с достаточной поддержкой C++14.