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

Отображение данных

Рефал-выражение в императивном языке представляет из себя чёрный ящик, допускающий выполнение следующих действий:

  1. Создание пустого выражения #CreateEmpty
  2. Создание выражения--символа из разного вида объектов, существующих в языке #CreateSymbol
  3. Создание выражение--терма путём одевания скобок на уже имеющееся выражение #CreateParenth
  4. Создание выражения путём конкатенации двух уже имеющихся выражений #ConcatTwo
  5. Создание выражения, являющегося подвыражением уже имеющегося выражения #CreateSubexpr
  6. Создание выражения путём снятия скобок с уже имеющегося выражения--скобочного терма #CreateSubParenth
  7. Присваивание выражению нового значения (другого выражения) #AssignExpr
  8. Вычисление длины выражения #ComputeLength
  9. Проверка, является ли выражение символом #IsSymbol
  10. Проверка, является ли выражение символом данного типа #IsInstanceOf
  11. Выдача печатного представления выражения #PrintRepresentation
  12. Проверка на равенство двух выражений #EqExprs
  13. Сравнение двух выражений на больше/меньше #CompareExprs

Этих операций достаточно для выражения любых рефал-конструкций.

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

  1. Проверка, является ли терм с данным номером символом #IsSymbolAt
  2. Проверка, является ли терм с данным номером объектом данного типа #IsInstanceOfAt
  3. Создание выражения из содержимого скобочного терма в уже имеющемся выражении #CreateSubParenthFrom
  4. Создание плоского выражения из массива объектов #CreateFlat
  5. Создание выражения из нескольких уже имеющихся путём их конкатенации #ConcatSeveral
  6. Проверка, равно ли выражение подвыражению, расположенному, начиная с данного адреса, в другом выражении #IsSubexpr
  7. Создание по данному выражению итератора, предоставляющего доступ к двум новым выражениям, разбивающим исходное, и умеющего двигать границу разбиения в обе стороны до допустимых пределов #ExprIterator

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

This topic: Refaldevel > WebHome > Compilation Principles
History: r2 - 15 Jul 2004 - 20:36:00 - OrloV
 
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback