Интерпретатор языка 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
В 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('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
принимает набор аргументов, разделённых запятой, и печатает их в стандартный вывод. Команда вставляет пробел между выводимыми значениями и выводит перевод строки по завершении.
Пример:
x = 4
w = 'world'
print x, x + 6, 'Hello, ' + w
Вывод:
4 10 Hello, world
В Mython поддерживаются комментарии, начинающиеся с символа #
. Весь следующий текст до конца текущей строки игнорируется.
В Mython блоки кода определяются отступами. Один отступ равен двум пробелам. Отступ в нечётное количество пробелов считается некорректным.
Интерпретатор Mython состоит из состоит из четырёх основных логических блоков:
- Лексический анализатор, или лексер
- Синтаксический анализатор, или парсер
- Семантический анализатор
- Таблица символов
Лексер выполняет лексический анализ, или сканирование. Лексер считывает последовательность символов, которые составляют исходную программу, и формирует из них значащие последовательности символов — лексемы. Для каждой лексемы анализатор строит выходной токен вида:
<token name, attribute value>
Имя токена — абстрактный символ, использующийся во время синтаксического анализа, а опциональное значение атрибута содержит дополнительную информацию, связанную с токеном. Далее токен передаётся следующей фазе - парсеру.
Парсер выполняет синтаксический анализ, или разбор. Парсер использует токены, полученные при лексическом анализе, для создания промежуточного представления. Оно описывает грамматическую структуру потока токенов. Такое представление — это абстрактное синтаксическое дерево, т.е. древовидная структура данных, в которой каждый внутренний узел задаёт операцию, а дочерние узлы — аргументы этой операции. Построенное синтаксическое дерево передаётся в семантический анализатор.
Семантический анализатор выполняет интерпретацию программы. Он последовательно обходит синтаксическое дерево, выполняя связанные с узлами дерева действия, и обновляет таблицу символов.
В таблице символов хранятся наименование переменных и их значения.
ООП, полиморфизм, шаблоны, лямбда-функции, стандартные алгоритмы, абстрактное синтаксическое дерево (AST).