Skip to content

Latest commit

 

History

History
218 lines (163 loc) · 15.9 KB

README.md

File metadata and controls

218 lines (163 loc) · 15.9 KB

Mython

Интерпретатор языка Mython

Содержание

Описание языка

Язык Mython - это упрощённое подмножество Python. Mython поддерживает целочисленные и строковые переменные, логические константы, типизацию переменных, арифметические и логические операции, сравнение, условный оператор, классы, методы, наследование.

Идентификаторы

Идентификаторы в Mython используются для обозначения имён переменных, классов и методов. Идентификаторы формируются так же, как в большинстве других языков программирования: произвольная последовательность, начинающаяся с латинской буквы либо с символа подчёркиваниясостоящая и далее состоящая из цифр, букв и символа подчёркивания.

Числа

В Mython используются только целые числа.

Строки

Строковая константа в Mython — это последовательность произвольных символов, размещающаяся на одной строке и ограниченная двойными кавычками " или одинарными '. Поддерживается экранирование спецсимволов \n, \t, \' и \".

Примеры строк:

    "hello"
    'world'
    'long string with a double quote " inside'
    "another long string with a single quote ' inside"
    ''    # empty string
    ""    # empty string

Логические константы и None

В Mython используются логические значения True и False, а также специальное значение None (аналог nullptr в C++).

Операции

В Mython определены следующие операции:

  • Арифметические операции для чисел +, -, *, / (деление выполняется нацело, деление на ноль вызывает ошибку времени выполнения).
  • Операция конкатенации строк, т.е. сложение строк (s = 'hello, ' + 'world').
  • Операции сравнения строк и целых чисел ==, !=, <=, >=, <, > (сравнение строк выполняется лексикографически).
  • Логические операции and, or, not.
  • Унарный минус.

Типизация

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

Условный оператор

В Mython поддерживается условный оператор. Его синтаксис:

    if <expression>:
      <actions>
    else:
      <actions>

Если expression истинно, выполняются actions под веткой if, если ложно — под веткой else. Наличие ветки else необязательно.

Классы

В Mython можно определить свой тип, создав класс. Класс имеет поля и методы. Объявление класса начинается с ключевого слова class, за которым следует идентификатор имени и объявление методов класса. Все поля объекта — публичные.

Пример класса «Прямоугольник»:

    class Rect:
      def __init__(w, h):
        self.w = w
        self.h = h

      def area():
        return self.w * self.h 

Специальный метод __init__ играет роль конструктора — он автоматически вызывается при создании нового объекта класса. Метод может отсутствовать. Неявный параметр всех методов — специальный параметр self, ссылающийся на текущий объект класса. Новый объект ранее объявленного класса создаётся указанием имени класса, за которым в скобках идут параметры, передаваемые методу __init__:

    r = Rect(10, 5)

В этом примере создаётся новый объект класса Rect. При вызове метода init параметр w будет иметь значение 10, а параметр h — 5. Созданный прямоугольник будет доступен в переменной r.

Методы

Методы в Mython начинаются с кючевого слова def, оно располагается с отступом в два пробела относительно класса. Инструкции, составляющие тело метода, имеют отступ в два пробела относительно ключевого слова def. Как и в случае полей класса, обращения к полям и методам текущего класса начинатются с self.. Команда return завершает выполнение метода и возвращает из него результат вычисления своего аргумента. Если исполнение метода не достигает команды return, метод возвращает None.

    class Rect:
      # ...
      def two_area():
        return 2 * self.area() 

Специальные методы

Кроме метода __init__, в Mython есть другие специальные методы:

  • __add__ - сложение классов.
  • __eq__, __lt__ - сравнение классов на "равно" и "меньше", соответственно.
  • __str__ - возвращает результат определения метода (если метод определён) или строковое представление адреса объекта в памяти (если метод не определён).

Наследование

В языке Mython у класса может быть один родительский класс. Если он есть, он указывается в скобках после имени класса и до символа двоеточия. Все методы родительского класса становятся доступны классу-потомку. При этом все методы публичные и виртуальные.

    class Shape:
      def area():
        return 'Not implemented'
      
      def it_is():
        return "It is " + self.name()
         
      def name():
        return "shape"

    class Rect(Shape):
      def __init__(w, h):
        self.w = w
        self.h = h

      def area():
        return self.w * self.h
      
      def name():
        return "rect"
    
    r = Rect(5,10)
    s = r.it_is()    # s == "It is rect"

Функция str

Функция str преобразует переданный ей аргумент в строку. Если аргумент — объект класса, она вызывает у него специальный метод __str__ и возвращает результат. Если метода __str__ в классе нет, функция возвращает строковое представление адреса объекта в памяти. Примеры:

    str('Hello')      # returns Hello
    str(100500)       # returns 100500
    str(False)        # returns False
    str(Rect(3, 4))   # if __str__ doesn't exist, str returns adress (for example - 0x2056fd0), else str returns result of __str__ (for example - Rect(3x4) )

Команда print

Специальная команда print принимает набор аргументов, разделённых запятой, и печатает их в стандартный вывод. Команда вставляет пробел между выводимыми значениями и выводит перевод строки по завершении. Пример:

    x = 4
    w = 'world'
    print x, x + 6, 'Hello, ' + w 

Вывод:

    4 10 Hello, world 

Комментарии

В Mython поддерживаются комментарии, начинающиеся с символа #. Весь следующий текст до конца текущей строки игнорируется.

Отступы

В Mython блоки кода определяются отступами. Один отступ равен двум пробелам. Отступ в нечётное количество пробелов считается некорректным.

Устройство интерпретатора

Интерпретатор Mython состоит из состоит из четырёх основных логических блоков:

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

Лексер

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

    <token name, attribute value>

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

Парсер

Парсер выполняет синтаксический анализ, или разбор. Парсер использует токены, полученные при лексическом анализе, для создания промежуточного представления. Оно описывает грамматическую структуру потока токенов. Такое представление — это абстрактное синтаксическое дерево, т.е. древовидная структура данных, в которой каждый внутренний узел задаёт операцию, а дочерние узлы — аргументы этой операции. Построенное синтаксическое дерево передаётся в семантический анализатор.

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

Семантический анализатор выполняет интерпретацию программы. Он последовательно обходит синтаксическое дерево, выполняя связанные с узлами дерева действия, и обновляет таблицу символов.

Таблица символов

В таблице символов хранятся наименование переменных и их значения.

Применяемые навыки

ООП, полиморфизм, шаблоны, лямбда-функции, стандартные алгоритмы, абстрактное синтаксическое дерево (AST).