Skip to content

sergey-shambir/pythonish-interpreter

Repository files navigation

Интерпретатор 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.

About

Python-like language interpreter written using C++14

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages