/* rfp_asail.rf */

Вспомогательные функции, используемые компилятором

  1. $func Name-To-CPP t.Name = e.legal-cpp-name

    Функция Name-To-CPP преобразует терм t.Name в имя для использования в C-программе s.legal-cpp-name и полученный результат помещает в таблицу имен &Func-Таble и в ящик &Func-Names.

    Это не совсем верно. Как должно быть написано в комментарии:
     * Gets function name or variable and returns legal C++ name corresponding to
     * it. If is called with such parameter at the first time then stores C++ name
     * in the appropriate table for further using. Also put new name in the
     * appropriate box. Box and table for variables is updated for each new
     * function and box and table for functions is updated for each new module.
    

  2. $func Build-CPP-Name e.words = e.cpp-chars

    Функция Build-CPP-Name создает уникальное имя e.cpp-chars по списку слов из Рефал-программы e.words .

    Нет, построенное имя не обязано быть уникальным. Эта функция просто переводит e.QualifiedName в имя на С++, расставляя ‘_’ между словами и убирая символы, не являющиеся легальными в С++.

  3. $func Find-Unused-Name (e.used-names) e.name = e.unused-name

    Функция Find-Unused-Name является вспомогательной для функции Build-CPP-Name .

    Нет, она не является вспомогательной. Она вызывается после, для того, чтобы сделать построенное имя уникальным, путём приписывания к его концу некоторого кол-ва ‘_’.

  4. $func Word-To-CPP-Chars s.word = e.cpp-chars

    Функция Word-To-CPP-Chars создает из исходного Рефал-слова s.word строку e.cpp-chars на C++.

  5. $func Chars-To-CPP-Chars e.chars = e.cpp-chars

    Функция Chars-To-CPP-Chars из списка символов на Рефале+ e.chars создает список символов на C++ e.cpp-chars.

  6. $func Expr-Ref-To-CPP s.inner-call? e.ASAIL-Expr-Ref = e.CPP-Expr-Ref

    Функция Expr-Ref-To-CPP преобразует выражение-ссылку e.ASAIL-Expr-Ref в соответствующее ему выражение на C++ e.CPP-Expr-Ref.

    ??? Вовсе нет! Ты смотрела Светино описание синтаксиса? Не выражение-ссылку, а обыкновенное Рефал-выражение.

  7. $func Expr-Int-To-CPP e.ASAIL-Expr-Int = e.CPP-Expr-Int

    Функция Expr-Int-To-CPP преобразует выражение типа Int на АИЯ в соответствующее ему выражение на C++ .

  8. $func Step-To-CPP e.step-operators = e.cpp-step-operators

    Функция Step-To-CPP преобразует конструкции инкремента переменной из исходного списка e.step-operators в соответствующие конструкции на C++, которые записываются в список e.cpp-step-operators.

  9. $func Infix-To-CPP s.func-for-converting-args-to-cpp s.op e.args = e.cpp-expr

    Функция Infix-To-CPP проносит знак операции s.op через список аргументов e.args, элементы которого преобразуются в аргументы на C++ с помощью функции s.func-for-converting-args-to-cpp.

    Я думаю, лучше сказать “расставляет знак операции между аргументами e.args”.

  10. $func Op-Arg-To-CPP s.op = s.func-for-converting-args-to-cpp

    Функция Op-Arg-To-CPP вызывает функцию для обработки знака операции - логической или арифметической.

    Нет. Она возвращает функцию для обработки аргументов операции, в зависимости от типа операции — логического или арифметического.

  11. $func Expr-To-CPP e.ASAIL-expr = e.CPP-Expr

    Функция Expr-To-CPP по полученному на входе выражению на абстрактном императивном языке e.ASAIL-Expr строит выражение на языке C++ e.CPP-Expr.

    Здесь правильно сказать, что она делает это путём определения типа выражения — Expr или Int, и вызова соответствующей функции (Expr-Ref-To-CPP или Expr-Int-To-CPP).

  12. $func Const-Expr-To-CPP e.ASAIL-const-expr = e.CPP-const-expr

    Функция Const-Expr-To-CPP получает на входе константное выражение на АИЯ e.ASAIL-const-expr и преобразует его в константное выражение на языке C++ e.CPP-const-expr

  13. $func Args-To-CPP e.Arg-Res-Tag e.ASAIL-Args = e.CPP-Args

    Функция Args-To-CPP по полученному списку аргументов на АИЯ (e.Arg-Res-Tag) e.ASAIL-Args строит список аргументов на языке C++ e.CPP-Args.

    У тебя 2 e-выражения на одном уровне в формате функции. Такого не может быть. Но у неё и в rfp_asail.rf формат был указан неправильно. Я исправил. Надо написать, что функция ведёт себя по-разному (и как) в зависимости от значения Tag'а.

  14. $func Symbol-To-CPP s.RFP-Symbol = e.CPP-String

    Функция Symbol-To-CPP получаeт на входе символ-слово, или символ-литеру, или символ-число s.RFP-Symbol. Символы-числа она переводит в их изображения, а символы-слова и символы-литеры переводит в строку литер на С++ e.CPP-String.

  15. $func Chars-To-CPP e.expr = e.CPP-String

    Функция Chars-To-CPP получает на вход цепочку символов-литер e.expr и преобразует его в строку на C++ e.CPP-String.

  16. $func Cond-To-CPP e.cond = e.CPP-Cond

    Функция Cond-To-CPP на входе получает выражение-условие на АИЯ e.cond и преобразует его в условие на языке C++ e.CPP-Cond

  17. $func RFP-ASAIL-To-CPP e.asail = e.cpp

    Функция RFP-ASAIL-To-CPP получает на входе выражение на АИЯ e.asail и вызывает далее функцию ASAIL-TO-CPP, которая преобразует его в соответствующее выражение на C++ e.cpp.

    И зачем же тогда нужна эта функция?

  18. $table Func-Table

    Таблица Func-Table используется для хранения имен функций на Рефале+ и соответствующих им имен на C++.

  19. $table Var-Table

    Таблица Var-Table предназначена для хранения имен переменных на Рефале+ и соответствующих им имен на С++, используемых в функции.

  20. $box Func-Names

    Ящик Func-Names предназначен для хранения имен функций, построенных в программе.

  21. $box Var-Names

    Ящик Var-Names предназначен для хранения имен переменных, используемых в функции.

Конструкции АИЯ и соответствующие им конструкции С++

(FUNC t.name (e.args) (e.ress) e.body)

RF_FUNC (t.name', ((RF_ARG) Vars e.args'), ((RF_RES) Vars e.ress'))) e.body' RF_END,

где t.name' - преобразованное имя описываемой функции с помощью функции Name-To-CPP, RF_ARG - список аргументов через пробел, a RF_RES список имен результатов через пробел.

Даже зная, что должно быть, я не могу понять, что здесь написано. Что такое тогда Vars, e.args', e.ress'? И скобки, как всегда, не сбалансированы.

(IF (e.cond) e.body)

if (e.cond') {

e.body' },

где e.cond' и e.body'получаются преобразованием e.cond и e.body с помощью функций Cond-To-CPP и рекурсивного вызова ASAIL-To-CPP

(FOR (e.label) (e.cond) (e.step) e.body)

for ( ; e.cond'; e.step'){

e.body'

e.label' },

где e.cond' - результат преобразования e.cond функцией Cond-To-CPP , e.step' получено преобразованием e.step с помощью функции Step-To-CPP, e.label' преобразованное имя метки e.label (оно может быть пустым),и e.body' -результат преобразования e.body рекурсивным вызовом функции ASAIL-To-CPP

(LABEL t.label e.body)

{ e.body' } LABEL t.name' : { } ,

где e.body' получается путем преобразования e.body рекурсивно функцией RFP-ASAIL-To-CPP, t.name' - результат работы функции Name-To-CPP над аргументом (LABEL t.label)

(TRY e.body)

trap { e.body' }

здесь e.body' получено в результате работы функции ASAIL-To-CPP над аргументом e.body

(CATCH-ERROR e.body)

with { e.body' },

где e.body' получено в результате работы функции ASAIL-To-CPP над аргументом e.body. Используется для обработки исключительных ситуаций.

(CONST e.expr)

const e.expr',

где e.expr' получается преобразованием e.expr с помощью функции Expr-To-CPP

RETURN

return true;

RETFAIL

retfail;

FATAL

FATAL (“Unexpected fail”);

(LSPLIT e.expr (e.min) t.var1 t.var2)

lsplit (e.expr', e.min', e.var1', e.var2');,

где e.expr' и e.min' результат преобразования e.expr с помощью функции Expr-Ref-To-CPP и e.min с помощью функции Expr-Int-To-CPP, e.var1' и e.var2' получены в результате работы функции Name -To-CPP над аргументами e.var1, e.var2 . Функция используется для разбиения выражения e.expr' на два выражения: e.var1' и e.var2', длина e.var1' равна e.min', длина e.var2' равна длине остатка от выражения e.expr'. Далее эти выражения могут быть использованы в цикле.

(RSPLIT e.expr (e.min) t.var1 t.var2)

rsplit (e.expr', e.min', e.var1', e.var2');,

где e.expr' и e.min' результат преобразования e.expr с помощью функции Expr-Ref-To-CPP и e.min с помощью функции Expr-Int-To-CPP, e.var1' и e.var2' получены в результате работы функции Name -To-CPP над аргументами e.var1, e.var2 . Функция используется для разбиения выражения e.expr' на два выражения: e.var1' и e.var2', длина e.var2' равна e.min', длина e.var1' равна длине остатка от выражения e.expr'. Далее эти выражения могут быть использованы в цикле.

(ASSIGN t.var e.expr)

t.var' = e.expr'; -

оператор присваивания, здесь t.var' - результат работы функции Name-To-CPP над аргументом t.var, e.expr' - результат работы функции Expr-To-CPP над аргументом e.expr

(DECL s.type t.var)

s.type t.var'; -

объявление переменной, где t.var' получено путем преобразования t.var с помощью функции Name-To-CPP

(EXPR e.expr)

Expr (e.expr'); -

создание объекта класа Expr, где e.expr'- преобразованное выражение e.expr с помощью функции Chars-To-CPP

(DEREF e.expr (e.pos))

Expr (e.expr', e.pos'); -

создание объекта класса Expr, где t.var' получается в результате преобразования t.var с помощью функции Name-To-CPP, e.expr' - результат преобразования e.expr функцией Expr-Ref-To-CPP, e.pos' полученo путем преобразования e.pos с помощью функции Expr-Int-To-CPP

А что такое t.var? Дело в том, что есть по два варианта DEREF и SUBEXPR. Для заведения новой переменной, и для использования внутри выражения, когда переменная не заводится и, соответственно, t.var нету. А у тебя описано только по одному варианту каждой конструкции.

(SUBEXPR t.var e.expr (e.pos) (e.len))

Expr t.var' (e.expr', e.pos', e.len'); -

создание объекта класса Expr, где t.var' - преобразованное имя переменной t.var и e.expr' получено преобразованием e.expr функцией Expr-Ref-To-CPP, e.pos',e.len' - выражения, полученные преобразованием e.pos, e.len с помощью функции Expr-Int-To-CPP

(DROP t.var)

t.var'.drop();,

где t.var' - преобразованное имя переменной t.var с помощью функции Name-To-CPP. После того, как отработала эта функция, переменная t.var' нигде далее не используется.

(CONTINUE t.label)

goto t.label'; -

оператор goto, где t.label' получено в результате вызова функции Name-To-CPP над аргументом t.label

(BREAK t.label)

goto t.label'; -

оператор goto, где t.label' получено в результате вызова функции Name-To-CPP над аргументом t.label

(ERROR e.expr)

error (e.expr');

генерация сообщения об ошибке, где e.expr' получается в результате работы функции Expr-Ref-To-CPP над аргументом e.expr

(CONSTEXPR t.name e.expr)

const Expr t.name' = e.expr';

инициализация константного выражения, где t.name' - результат работы функции Name-To-CPP над аргументом t.name, а e.expr' - результат работы функции Const-Expr-To-CPP над аргументом e.expr

(DECL-FUNC t.name)

(RF_DECL (t.name'))

создание объявления функции, где t.name' - ее имя, полученное из t.name с помощью вызова Name-To-CPP.

(s.call t.name (e.exprs) (e.ress))

RF_CALL (t.name', (Exprs e.expr'), (Vars e.ress'));

RF_TAILCALL (t.name', (Exprs e.expr'), (Vars e.ress'));

здесь значением s.call может быть как RF_CALL, так и RF_TAILCALL, e.args и e.ress' получены из e.exprs и e.ress с помощью функции Args-To-CPP, t.name' получено из t.name с помощью функции Name-To-CPP

Что за Exprs и Vars? Ничего такого там не должно быть!

(PAREN e.expr)

(e.expr')(),

где e.expr' выражение, полученное преобразованием e.expr функцией Expr-Ref-To-CPP

(LENGTH e.expr)

(int) (e.expr').get_len();,

где e.expr' получено путем преобразования e.expr функцией Expr-Ref-To-CPP . Функция возвращает длину выражения e.expr', а именно, количество термов, из которых оно состоит.

(SYMBOL? e.expr (e.pos))

(e.expr').symbol_at(e.pos'),

где e.expr' - результат преобразования e.expr функцией Expr-Ref-To-CPP и e.pos' является результатом работы функции Expr-Int-To-CPP . Функция проверяет, находится ли в позиции e.pos' выражения e.expr' символ.

(FLAT-SUBEXPR? E.expr (e.pos) (e.len))

(e.expr').flat_at(e.pos', e.len'),

где e.expr' полученo в результате работы функции Expr-Ref-To-CPP над аргументом e.expr, e.pos', e.len' получены в результат работы функции Expr-Int-To-CPP Функция проверяет, не содежит ли подвыражение, начинающееся с позиции e.pos' длины e.len' выражения e.expr' вложенных термов.

(EQ (e.expr1) (e.pos1) (e.len1) (e.expr2) (e.pos2) (e.len2))

eq (e.expr1', e.pos1', e.len1', e.expr2', e.pos2', e.len2'),

где e.expr1', e.expr2' получены с помощью функции Expr-Ref-To-CPP, примененной к аргументам e.expr1, e.expr2, e.pos1', e.pos2', e.len1', e.len2' получены применением функции Expr-Int-To-CPP к аргументам e.pos1, e.pos2, e.len1, e.len2 Функция проверяет равенство подвыражения выражения e.expr1, начиная с позиции e.pos1 длины e.len1 подвыражению выражения e.expr2, начиная с позиции e.pos2 длины e.len2.

(FLAT-EQ (e.expr1) (e.pos1) (e.expr2) (e.pos2) (e.len))

flat_eq (e.expr1', e.pos1', e.expr2', e.pos2', e.len'),

где e.expr1' , e.expr2' получаются в результате работы функции Expr-Ref-To-CPP над аргументами e.expr1, e.expr2,. e.pos1', e.pos2', e.len' получаются в результате работы функции Expr-Int-to-CPP над аргументами e.pos1, e.pos2, e.len. Функция вызывается для проверки равенства двух входных выражений, являющихся подвыражениями e.expr1, e.expr2, начиная с позиций e.pos1, e.pos2 соответственно,если известно, что их длины равны.

(NOT e.cond)

(! e.cond'),

оператор отрицания условия e.cond', полученного преобразованием условия e.cond с помощью функции Cond-To-CPP

(INC-ITER t.var)

iter (t.var')++,

операция инкремента для объекта класса iter

(MAX e.args)

max (Ints e.args'),

где e.args' - результат преобразования e.args функцией Args-To-CPP . Функция возвращает максимальное значение из списка целочисленных аргументов e.args'.

Нету там никаких Ints!

(MIN e.args)

min (Ints e.args')),

где e.args' - получены из e.args с помощью функции Args-To-CPP. Функция возвращает минимальное значение из списка целочисленных аргументов e.args'.

Нету там никаких Ints!

(INFIX s.op e.args)

e.arg' s.op e.arg'',

где e.arg', e.arg'' - аргументы из списка e.args, s.op - символ операции.

А какие это аргументы — первый и второй, или последний и предпоследний?

(REF e.QualifiedName)

e.QualifiedName'

уникальный идентификатор C++

(VAR (e.QualifiedName))

e.QualifiedName'

уникальное имя переменной

(LABEL (e.QualifiedName))

e.QualifiedName'

уникальное имя метки

(e.QualifiedName)

e.QualifiedName'

уникальный идентификатор С++