Методы разработки интерпретатора языка Рефал-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

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

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