30
Методы разработки интерпретатора языка Рефал-2 Автор: Тодуа Антон Романович Научные руководители: к.ф.-м.н. Большакова Е.И. Носков А.А.

Тодуа. Методы разработки интерпретатора языка Рефал-2

  • Upload
    -

  • View
    75

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Тодуа. Методы разработки интерпретатора языка Рефал-2

Методы разработки интерпретатора

языка Рефал-2

Автор:

Тодуа Антон Романович

Научные руководители:

к.ф.-м.н. Большакова Е.И.

Носков А.А.

Page 2: Тодуа. Методы разработки интерпретатора языка Рефал-2

Содержание

Страница: 2 из 30

• Язык Рефал

История и основы

• Язык Рефал-2

Основные особенности и примеры

• Принципы реализации Рефал-интерпретатора

Проблемы реализации и представление данных

• Разработка учебного интерпретатора

Организация интерпретатора и данных

Page 3: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал

• Первая версия Рефала была создана в 1966 году В.Ф. Турчиным в качестве метаязыка для описания семантики других языков.

• Диалекты языка Рефал:

– Рефал-2

– Рефал-5

– Рефал-плюс

• Возможные применения:

– Символьные вычисления

– Машинный перевод

– Решение задач искусственного интеллекта

История

Страница: 3 из 30

Page 4: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал

• Программа – совокупность функций

• Функция – последовательность правил

• Правило – левая часть (образец) и правая часть

• Поле зрения – данные программы

• Функция получает в качестве аргумента часть поля зрения и модифицирует её в соответствии с правилами

Основы

Страница: 4 из 30

Page 5: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал

• Выражение – последовательность термов

• Терм – символ (метка, число, литера) или выражение в структурных скобках

Данные (выражение)

Примеры символов: Числа: /0/, /1/, /12345/, /9999/, … Метки: /label/, /metka/, … Литеры: 'a', 'b', 'c', 'd', 'z', …

Пример выражения: /repeat/('i'/assign/'i'/plus//1/)

/until/('i'/equal//10/)

Страница: 5 из 30

Page 6: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал Левая и правая части правила функции

• Левая часть правила – в общем случае выражение с переменными

• Правая часть правила – в общем случае выражение с переменными и вызовами функций

Примеры: /for/s1/assign/(v2)/to/(v3)/do/(e4)

/PROCEDURE/ e1 (/BEGIN/ e2 /END/) e3

Примеры: <checkt (e2)s1 <label e2>> <op e3>

<br <ftochar s2> '=' s1e3>

Страница: 6 из 30

Page 7: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал-2

• Типы переменных – 4 типа: S, W, V, E

Основные особенности

Страница: 7 из 30

Тип Допустимое множество значений

S Один символ

W Один терм

V Произвольная непустая последовательность термов

E Произвольная последовательность термов

• Наличие спецификаторов у переменных

• Наличие именованных спецификаторов

• Возможность указать способ отождествления (правое или левое)

Page 8: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал-2

• Спецификатор описывает допустимое множество термов в выражении

• Встроенные спецификаторы (S, F, N, O, L, D, W, B) – описывают стандартные множества

Спецификаторы

Примеры именованных спецификаторов: octal S (/8//9/)L * цифры от 0 до 7 hex S D 'abcdefABCDEF'* шестнадцатеричные цифры

Примеры спецификаторов переменных: v:octal:1 * восьмеричное число s(:hex:)2 * шестнадцатеричная цифра e((/end//dot/))X

* выражение не содержащее /end/ и /dot/

Страница: 8 из 30

Page 9: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал-2

• Отождествление – сопоставление выражения и образца

• Отождествление термов осуществимо если термы полностью совпадают

• Переменная отождествляется с любым значением из множества допустимых значений переменной данного типа, которое удовлетворяет спецификатору переменной

• Для выражения общего вида результат отождествления не всегда однозначен, поэтому указывается порядок (L или R)

Отождествление

Страница: 9 из 30

Пример (неоднозначность отождествления):

s1e2(e3)e4 * образец /foo/'ab'('c')'de'('f')'gh' * выражение

Page 10: Тодуа. Методы разработки интерпретатора языка Рефал-2

Язык Рефал-2 Примеры функций

Страница: 10 из 30

go = <parens<numbers '1(2(3(4)3)2)1(2)'>>

* Переводит последовательность литер – десятичных цифр в числа numbers e1v(D)2s((D))3e4 = e1<numb v2>s3<numbers e4>

v(D)1 = <numb v1>

e1 = e1

* Преобразует скобки-литеры в структурные скобки parens e1')'e2 = <parens <parens2 e1> e2>

e1 = e1

parens2 R e1'('e2 = e1(e2)

* Преобразует скобки-литеры в структурные скобки (другой вариант) o_parens e1'('e(('('))2')'e3 = <o_parens e1(e2)e3>

e1 = e1

<go> /1/(/2/(/3/(/4/)/3/)/2/)/1/(/2/)

Page 11: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Представление поля зрения (выражения)

PREV

NEXT

TAG

CODE

PREV

NEXT

TAG

CODE

PREV

NEXT

TAG

CODE

TAG – тип звена: TAGO (литера), TAGF (метка), TAGN (число), TAGLB (левая структурная скобка), TAGRB (правая структурная скобка), TAGK (левая функциональная скобка), TAGD (правая функциональная скобка)

CODE – значение звена (зависит от типа звена)

Страница: 11 из 30

Двусвязный список звеньев:

Page 12: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Проблема выполнения отождествления

• В общем случае отождествление VE-переменных – переборная задача. Следовательно, алгоритм отождествления имеет высокую сложность.

• В некоторых случаях перебор можно сократить.

• Необходим предварительный анализ левой части

Пример: e1'+'e2'*'e3 В данном случае если удлинение e2 невозможно, то удлинять e1 нет смысла

Страница: 12 из 30

Page 13: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Проблема лишнего копирования переменных

• Значение одной и той же переменной может входить в левую и правую части несколько раз

• Если вхождений значений переменной в правой части не больше чем в левой, то при формировании результата её значение копировать не нужно

• Необходим предварительный анализ правой части

Пример: e1 s2 s2 w3 = w3 e1 w3 s2 w3

значения e1 и s2 копировать не нужно,

значение w3 нужно скопировать два раза.

Страница: 13 из 30

Page 14: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Проблема повторного выполнения отождествления

• Последовательность действий отождествления, выполняемая для разных соседних предложений функции, может частично совпадать

• При переходе на следующее предложение нет необходимости повторять уже выполненные действия

Пример: /1/s1(w5e2/3/)e4s1eQ = … /1/sQ(wXeZ/3/)e1 = …

/1/sDvQ = …

Страница: 14 из 30

Page 15: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Решение проблем – внутренний язык

• Предварительный анализ можно и нужно выполнять до начала выполнения программы

• Результат выполнения предварительного анализа удобно представлять как последовательность заранее известных команд, имеющих простую семантику

• Вычисление функции – последовательное выполнение команд

• Совокупность команд – внутренний язык

Страница: 15 из 30

Page 16: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Внутренний язык

• Был предложен Романенко С.А. в книге «Реализация Рефала-2»

• Содержит порядка 40 команд

• Команды делятся на 6 групп по количеству и типу аргументов : – Без аргументов

– С одним аргументом – числом

– С двумя аргументами – числами

– С одним аргументов – символом

– С одним аргументом – спецификатором

– С одним аргументом – адресом команды

Страница: 16 из 30

Page 17: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Структуры для внутреннего языка

• В процессе выполнения команд используются:

– Указатели на начало и конец отождествляемого подвыражения поля зрения

– Таблица звеньев. В процессе отождествления в таблицу добавляются указатели на звенья из отождествляемого подвыражения

– Стек переходов. Используется при последовательном удлинении VE-переменных для сохранения текущего состояния и для передачи управления с одного предложения на другое

Страница: 17 из 30

Page 18: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Примеры команд внутреннего языка

Страница: 18 из 30

Команда Аргументы Назначение

LSC (RSC) Символ Отождествление символа слева (справа)

LS (RS) Нет Отождествление S-переменной слева (справа)

LW (RW) Нет Отождествление W-переменной слева (справа)

LB (RB) Нет Отождествление скобок слева (справа)

SB 2 Числа Смена границ отождествляемого подвыражения

CE Нет Отождествление закрытого вхождения E-переменной

PLE (PRE) Нет Начало отождествления E-переменной слева (справа)

LE (RE) Нет Отождествление VE-переменной слева (справа)

EOE Число Уменьшение глубины стека переходов

SJUMP Команда Добавление точки возврата в стек переходов

LSD (RSD) Число Отождествление повторного вхождения S-переменной слева (справа)

Page 19: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Перевод на внутренний язык левой части

• При переводе левой части правила в дополнение к тривиальному алгоритму используется:

– Разложение левой части правил на независимые части: (s1e2w3)eXsY s1e2w3 и eXsY

– Выделение независимо удлиняющегося выражения: e1'+'e2'*'e3 (если отождествление e2 невозможно нет смысла удлинять e1)

– Наличие спецификаторов у переменных: e(N)1 e(O)2 (Значение e1 – самая длинная последовательность чисел с левого конца отождествляемого подвыражения)

Страница: 19 из 30

Page 20: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Примеры перевода левой части на внутренний язык

Страница: 20 из 30

* Отождествление независимых частей

(s1e2w3)eXsY

LB; LS; RW; CE; SB(3, 1); RS; CE;

* Отождествление без лишних удлинений e1

e1'+'e2'*'e3

PLE; LE; LSC('+'); EOE(1);

PLE; LE; LSC('*'); CE;

* Отождествление e1 без использования стека переходов

e(N)1 e(O)2

LMAX(спецификатор: N); CE;

Page 21: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Перевод на внутренний язык правой части

• Перевод правой части осуществляется слева направо. Каждому элементу правой части ставится в соответствие определённая команда:

Страница: 21 из 30

Символ S NS(S)

Левая структурная или функциональная скобка LB

Правая структурная скобка RB

Правая функциональная скобка BRACT

Переменная типа S MOVES или COPYS

Переменная типа W или V MOVEV или COPYE

Переменная типа E MOVEE или COPYE

• Выбор команды MOVE или COPY делается на основе информации, накопленной при переводе левой части.

Page 22: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора Расстановка операций перехода

• Последовательности команд внутреннего языка, полученные в результате перевода левой части, могут иметь общий префикс, т.е.

Страница: 22 из 30

A B D G

C E

F I H

A A

A

B D G

B E H C F I

• Последовательности команд внутреннего языка, полученные в результате перевода левой части, могут иметь общий префикс, т.е.

• Действия выполняемые интерпретатором при переходе на следующее правило будут частично повторяться. Для оптимизации добавляются команды перехода.

Page 23: Тодуа. Методы разработки интерпретатора языка Рефал-2

Принципы реализации Рефал-интерпретатора

Страница: 23 из 30

Пример перевода функции на внутренний язык

func sXv(D)2sXe1wY = <foo sXwY>e1<bar sXwY>

sXeZwY = <foo eZ>eZ

sXe1 = sX

* Перевод первого предложения LS; SJUMP(МЕТКА2); RW; SJUMP(МЕТКА1);

PLV; LESPC(спецификатор: D); LSD(2); CE; EOR; LB; NS(/foo/); MOVES(2); MOVEV(4); BRACT; MOVEE(7);

LB; NS(/bar/); MOVES(2); MOVEV(4); BRACT; EOS;

* Перевод второго предложения МЕТКА1:

CE; EOR; LB; NS(/foo/); MOVEE(6); BRACT; COPYE(6); EOS;

* Перевод третьего предложения МЕТКА2:

CE; EOR; MOVES(2); EOS;

Page 24: Тодуа. Методы разработки интерпретатора языка Рефал-2

… … …

Разработка учебного интерпретатора Структура модулей интерпретатора

Файл *.ref

Страница: 24 из 30

Парсер

Функция 1

Функция 2

Функция N

Транслятор

Команда

Команда

Команда

Метка 1

Метка 2

Метка N

Таблица меток

Интерпретатор команд

Метка I – имя функции

Page 25: Тодуа. Методы разработки интерпретатора языка Рефал-2

Разработка учебного интерпретатора Назначение модулей интерпретатора

Страница: 25 из 30

• Парсер:

– Производит лексический и синтаксический разбор

– Формирует таблицу функций

– Переводит функции во внутреннее представление

– Определяет стартовую (entry) функцию

• Транслятор:

– Переводит функции на внутренний язык команд

• Интерпретатор команд:

– Исполняет команды внутреннего языка

– Вызывает стартовую функцию

Page 26: Тодуа. Методы разработки интерпретатора языка Рефал-2

Разработка учебного интерпретатора Внутреннее представление выражения

Type

Value

Type

Value

Type

Value

enum Type {

T_char,

T_label,

T_number,

T_variable,

T_left_paren,

T_right_paren,

T_left_bracket,

T_right_bracket

};

union Value {

TChar c;

TLabel label;

TNumber number;

CLink* paired_paren;

TVariableName variable_name;

};

ВЫРАЖЕНИЕ

Страница: 26 из 30

Page 27: Тодуа. Методы разработки интерпретатора языка Рефал-2

Разработка учебного интерпретатора Внутреннее представление функции

Правило Правило

Выражение (правая часть)

Выражение (левая часть)

Таблица переменных

Флаг: right?

Функция

Выражение (правая часть)

Выражение (левая часть)

Таблица переменных

Флаг: right?

Выражение (правая часть)

Выражение (левая часть)

Таблица переменных

Флаг: right?

Правило

0 Тип (s, w, v, e) Спецификатор

1 Тип (s, w, v, e) Спецификатор

Z Тип (s, w, v, e) Спецификатор

Таблица переменных

Страница: 27 из 30

Page 28: Тодуа. Методы разработки интерпретатора языка Рефал-2

Set of chars

Разработка учебного интерпретатора Внутреннее представление спецификатора

Страница: 28 из 30

True (include) or False (except)

example S /0//1/('xz')/label_1/O('qf'/label_2//3/)/4/

Set of labels

True (include) or False (except)

Set of numbers

True (include) or False (except)

Structured terms

True (include) or False (except)

Спецификатор

Set of chars: {'x', 'z'}

False (except)

Set of labels: {/label_1/}

True (include)

Set of numbers: {0, 1, 4}

True (include)

Structured terms False (except)

Пример

Page 29: Тодуа. Методы разработки интерпретатора языка Рефал-2

Разработка учебного интерпретатора Построение спецификатора

class CQualifierBuilder {

public:

void Get(CQualifier* qualifier) const;

bool IsNegative() const;

void Reset();

void Label(TLabel label);

void Number(TNumber number);

void Char(TChar c);

void Qualifier(const CQualifier& qualifier);

void Negative();

void S(); void F(); void N(); void O();

void L(); void D(); void W(); void B();

}

Страница: 29 из 30

Page 30: Тодуа. Методы разработки интерпретатора языка Рефал-2

Разработка учебного интерпретатора Заключение

Страница: 30 из 30

• Реализовано на данный момент: – Внутреннее представление выражений и функций

– Внутренний язык команд

– Парсер (частично)

– Интерпретатор команд

– Спецификаторы

• Не реализовано: – Транслятор на внутренний язык команд

• Исходный код: github.com/cmc-msu-ai/refal