Upload
-
View
75
Download
4
Embed Size (px)
Citation preview
Методы разработки интерпретатора
языка Рефал-2
Автор:
Тодуа Антон Романович
Научные руководители:
к.ф.-м.н. Большакова Е.И.
Носков А.А.
Содержание
Страница: 2 из 30
• Язык Рефал
История и основы
• Язык Рефал-2
Основные особенности и примеры
• Принципы реализации Рефал-интерпретатора
Проблемы реализации и представление данных
• Разработка учебного интерпретатора
Организация интерпретатора и данных
Язык Рефал
• Первая версия Рефала была создана в 1966 году В.Ф. Турчиным в качестве метаязыка для описания семантики других языков.
• Диалекты языка Рефал:
– Рефал-2
– Рефал-5
– Рефал-плюс
• Возможные применения:
– Символьные вычисления
– Машинный перевод
– Решение задач искусственного интеллекта
История
Страница: 3 из 30
Язык Рефал
• Программа – совокупность функций
• Функция – последовательность правил
• Правило – левая часть (образец) и правая часть
• Поле зрения – данные программы
• Функция получает в качестве аргумента часть поля зрения и модифицирует её в соответствии с правилами
Основы
Страница: 4 из 30
Язык Рефал
• Выражение – последовательность термов
• Терм – символ (метка, число, литера) или выражение в структурных скобках
Данные (выражение)
Примеры символов: Числа: /0/, /1/, /12345/, /9999/, … Метки: /label/, /metka/, … Литеры: 'a', 'b', 'c', 'd', 'z', …
Пример выражения: /repeat/('i'/assign/'i'/plus//1/)
/until/('i'/equal//10/)
Страница: 5 из 30
Язык Рефал Левая и правая части правила функции
• Левая часть правила – в общем случае выражение с переменными
• Правая часть правила – в общем случае выражение с переменными и вызовами функций
Примеры: /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
Язык Рефал-2
• Типы переменных – 4 типа: S, W, V, E
Основные особенности
Страница: 7 из 30
Тип Допустимое множество значений
S Один символ
W Один терм
V Произвольная непустая последовательность термов
E Произвольная последовательность термов
• Наличие спецификаторов у переменных
• Наличие именованных спецификаторов
• Возможность указать способ отождествления (правое или левое)
Язык Рефал-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
Язык Рефал-2
• Отождествление – сопоставление выражения и образца
• Отождествление термов осуществимо если термы полностью совпадают
• Переменная отождествляется с любым значением из множества допустимых значений переменной данного типа, которое удовлетворяет спецификатору переменной
• Для выражения общего вида результат отождествления не всегда однозначен, поэтому указывается порядок (L или R)
Отождествление
Страница: 9 из 30
Пример (неоднозначность отождествления):
s1e2(e3)e4 * образец /foo/'ab'('c')'de'('f')'gh' * выражение
Язык Рефал-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/)
Принципы реализации Рефал-интерпретатора Представление поля зрения (выражения)
PREV
NEXT
TAG
CODE
PREV
NEXT
TAG
CODE
PREV
NEXT
TAG
CODE
TAG – тип звена: TAGO (литера), TAGF (метка), TAGN (число), TAGLB (левая структурная скобка), TAGRB (правая структурная скобка), TAGK (левая функциональная скобка), TAGD (правая функциональная скобка)
CODE – значение звена (зависит от типа звена)
Страница: 11 из 30
Двусвязный список звеньев:
Принципы реализации Рефал-интерпретатора Проблема выполнения отождествления
• В общем случае отождествление VE-переменных – переборная задача. Следовательно, алгоритм отождествления имеет высокую сложность.
• В некоторых случаях перебор можно сократить.
• Необходим предварительный анализ левой части
Пример: e1'+'e2'*'e3 В данном случае если удлинение e2 невозможно, то удлинять e1 нет смысла
Страница: 12 из 30
Принципы реализации Рефал-интерпретатора Проблема лишнего копирования переменных
• Значение одной и той же переменной может входить в левую и правую части несколько раз
• Если вхождений значений переменной в правой части не больше чем в левой, то при формировании результата её значение копировать не нужно
• Необходим предварительный анализ правой части
Пример: e1 s2 s2 w3 = w3 e1 w3 s2 w3
значения e1 и s2 копировать не нужно,
значение w3 нужно скопировать два раза.
Страница: 13 из 30
Принципы реализации Рефал-интерпретатора Проблема повторного выполнения отождествления
• Последовательность действий отождествления, выполняемая для разных соседних предложений функции, может частично совпадать
• При переходе на следующее предложение нет необходимости повторять уже выполненные действия
Пример: /1/s1(w5e2/3/)e4s1eQ = … /1/sQ(wXeZ/3/)e1 = …
/1/sDvQ = …
Страница: 14 из 30
Принципы реализации Рефал-интерпретатора Решение проблем – внутренний язык
• Предварительный анализ можно и нужно выполнять до начала выполнения программы
• Результат выполнения предварительного анализа удобно представлять как последовательность заранее известных команд, имеющих простую семантику
• Вычисление функции – последовательное выполнение команд
• Совокупность команд – внутренний язык
Страница: 15 из 30
Принципы реализации Рефал-интерпретатора Внутренний язык
• Был предложен Романенко С.А. в книге «Реализация Рефала-2»
• Содержит порядка 40 команд
• Команды делятся на 6 групп по количеству и типу аргументов : – Без аргументов
– С одним аргументом – числом
– С двумя аргументами – числами
– С одним аргументов – символом
– С одним аргументом – спецификатором
– С одним аргументом – адресом команды
Страница: 16 из 30
Принципы реализации Рефал-интерпретатора Структуры для внутреннего языка
• В процессе выполнения команд используются:
– Указатели на начало и конец отождествляемого подвыражения поля зрения
– Таблица звеньев. В процессе отождествления в таблицу добавляются указатели на звенья из отождествляемого подвыражения
– Стек переходов. Используется при последовательном удлинении VE-переменных для сохранения текущего состояния и для передачи управления с одного предложения на другое
Страница: 17 из 30
Принципы реализации Рефал-интерпретатора Примеры команд внутреннего языка
Страница: 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-переменной слева (справа)
Принципы реализации Рефал-интерпретатора Перевод на внутренний язык левой части
• При переводе левой части правила в дополнение к тривиальному алгоритму используется:
– Разложение левой части правил на независимые части: (s1e2w3)eXsY s1e2w3 и eXsY
– Выделение независимо удлиняющегося выражения: e1'+'e2'*'e3 (если отождествление e2 невозможно нет смысла удлинять e1)
– Наличие спецификаторов у переменных: e(N)1 e(O)2 (Значение e1 – самая длинная последовательность чисел с левого конца отождествляемого подвыражения)
Страница: 19 из 30
Принципы реализации Рефал-интерпретатора Примеры перевода левой части на внутренний язык
Страница: 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;
Принципы реализации Рефал-интерпретатора Перевод на внутренний язык правой части
• Перевод правой части осуществляется слева направо. Каждому элементу правой части ставится в соответствие определённая команда:
Страница: 21 из 30
Символ S NS(S)
Левая структурная или функциональная скобка LB
Правая структурная скобка RB
Правая функциональная скобка BRACT
Переменная типа S MOVES или COPYS
Переменная типа W или V MOVEV или COPYE
Переменная типа E MOVEE или COPYE
• Выбор команды MOVE или COPY делается на основе информации, накопленной при переводе левой части.
Принципы реализации Рефал-интерпретатора Расстановка операций перехода
• Последовательности команд внутреннего языка, полученные в результате перевода левой части, могут иметь общий префикс, т.е.
Страница: 22 из 30
A B D G
C E
F I H
A A
A
B D G
B E H C F I
• Последовательности команд внутреннего языка, полученные в результате перевода левой части, могут иметь общий префикс, т.е.
• Действия выполняемые интерпретатором при переходе на следующее правило будут частично повторяться. Для оптимизации добавляются команды перехода.
Принципы реализации Рефал-интерпретатора
Страница: 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;
… … …
Разработка учебного интерпретатора Структура модулей интерпретатора
Файл *.ref
Страница: 24 из 30
Парсер
Функция 1
Функция 2
Функция N
Транслятор
Команда
Команда
Команда
Метка 1
Метка 2
Метка N
Таблица меток
Интерпретатор команд
Метка I – имя функции
Разработка учебного интерпретатора Назначение модулей интерпретатора
Страница: 25 из 30
• Парсер:
– Производит лексический и синтаксический разбор
– Формирует таблицу функций
– Переводит функции во внутреннее представление
– Определяет стартовую (entry) функцию
• Транслятор:
– Переводит функции на внутренний язык команд
• Интерпретатор команд:
– Исполняет команды внутреннего языка
– Вызывает стартовую функцию
Разработка учебного интерпретатора Внутреннее представление выражения
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
Разработка учебного интерпретатора Внутреннее представление функции
Правило Правило
Выражение (правая часть)
Выражение (левая часть)
Таблица переменных
Флаг: right?
Функция
Выражение (правая часть)
Выражение (левая часть)
Таблица переменных
Флаг: right?
Выражение (правая часть)
Выражение (левая часть)
Таблица переменных
Флаг: right?
Правило
0 Тип (s, w, v, e) Спецификатор
1 Тип (s, w, v, e) Спецификатор
Z Тип (s, w, v, e) Спецификатор
Таблица переменных
…
Страница: 27 из 30
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)
Пример
Разработка учебного интерпретатора Построение спецификатора
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
Разработка учебного интерпретатора Заключение
Страница: 30 из 30
• Реализовано на данный момент: – Внутреннее представление выражений и функций
– Внутренний язык команд
– Парсер (частично)
– Интерпретатор команд
– Спецификаторы
• Не реализовано: – Транслятор на внутренний язык команд
• Исходный код: github.com/cmc-msu-ai/refal