Giter Club home page Giter Club logo

cpp-mython's Introduction

Интерпретатор языка Mython (упрощенного подмножества Python)

На вход поступает текст программы, а интерпретатор выводит в выходной поток результат всех команд print
Интерпретатор состоит из четырёх основных логических блоков:

  • Лексический анализатор, или лексер
  • Синтаксический анализатор, или парсер
  • Семантический анализатор
  • Таблица символов

Лексический анализатор

Лексический анализатор — его также называют сканером или лексером — считывает последовательность символов, которые составляют исходную программу, и формирует из них значащие последовательности символов — лексемы. Для каждой лексемы анализатор строит выходной токен.

  1. lexer.h
  2. lexer.cpp
  3. unit tests

Тип Token

Для удобства представления лексем используется std::variant

Методы для компактного анализа содержимого токенов:
  • bool Is()
  • const T& As()
  • const T* TryAs()

Класс Lexer

Выполняет лексический разбор программы. Класс принимает ссылку на поток ввода, из которого считывает текст программы, и выдаёт последовательность лексем программы.

Методы:
  • const Token& CurrentToken() возвращает ссылку на последнюю лексему, считанную лексером. Этот метод можно вызывать у объекта сразу после его создания. После выполнения метода NextToken метод CurrentToken должен возвращает ссылку на только что считанную лексему
  • Token NextToken() считывает и возвращает очередную лексему из входного потока. Если входной поток пуст, метод возвращает лексему token_type::Eof
  • Expect() проверяет, что CurrentToken() имеет тип T. Если это не так, он бросает исключение LexerError
  • Expect<T, U>(const U& value) проверяет, что CurrentToken() имеет тип T, а значение текущей лексемы равно value
  • ExpectNext() и ExpectNext<T, U>(const U& value) сначала вызывают NextToken, а затем — соответствующий метод Expect

Runtime-модуль интерпретатора

Отвечает за управление состоянием программы во время её работы. Модуль реализует встроенные типы данных языка Mython и таблицу символов

  1. runtime.h
  2. runtime.cpp
  3. unit tests

Абстрактный класс Object

Его единственный чисто виртуальный метод Print выводит строковое представление объекта в заданный поток вывода. Наследники Object, отвечающие за хранение конкретных типов объектов, переопределят этот метод в соответствии с требованиями языка
Классы-наследники Object:

  • Шаблонный класс ValueObject — основа для представления объектов-значений: строк, чисел и логических значений. Параметр T задаёт тип для хранения значений - int, std::string или bool. На основе шаблона ValueObject определены классы String, Bool и Number
  • Class хранит информацию о пользовательском классе: набор собственных методов класса и ссылку на класс-родитель. Метод класса — это исполняемый фрагмент кода на Mython, у которого есть имя и набор формальных параметров. В интерпретаторе метод представлен структурой Method
  • ClassInstance — экземпляр класса, хранит значения полей. Предоставляет доступ к полям объекта и позволяет вызывать его методы

Класс ObjectHolder

Вспомогательный класс-обёртка. Содержит методы, которые облегчают конструирование объектов и доступ к их значению
Методы:

  • Own копирует или перемещает значение конкретного класса-наследника Object в динамическую память и возвращает владеющий этим объектом ObjectHolder. Копии возвращённого ObjectHolder будут также совместно владеть объектом. Это основной способ создания ObjectHolder
  • Share возвращает невладеющий ObjectHolder, который ссылается на существующий объект, но не контролирует время жизни. Такой способ создания ObjectHolder применяется для передачи self при вызове методов
  • None возвращает «пустой» ObjectHolder, эквивалентный значению None

Интерфейс Executable

Связывает runtime-модуль с семантическим анализатором

Интерфейс Context

Используется методом Object::Print. Этот интерфейс обеспечивает связь интерпретатора с внешним миром. Метод Context::GetOutputStream() возвращает ссылку на поток вывода, в который интерпретатор выводит данные, встретив команду print

Дополнительные функции

  • Функция bool IsTrue(const ObjectHolder& object) проверяет, содержится ли в object значение, приводимое к True. Для значений 0, False, None и пустых строк функция возвращает false. В остальных случаях возвращается true
  • Функция Equal возвращает true, если её аргументы содержат одинаковые числа, строки или логические значения, и false — если разные
  • Функция Less для объектов, которые хранят строки, числа и логические значения, возвращает результат сравнения, используя оператор <
  • Функции NotEqual, Greater, LessOrEqual, GreaterOrEqual реализуются на основе Equal и/или Less

Классы-узлы абстрактного синтаксического дерева (AST)

  1. statement.h
  2. statement.cpp
  3. unit tests

cpp-mython's People

Contributors

tatiana90st avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.