/* rfp_asail.rf */
Вспомогательные функции, используемые компилятором
$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.
$func Build-CPP-Name e.words = e.cpp-chars
Функция Build-CPP-Name создает уникальное имя e.cpp-chars по списку слов из Рефал-программы e.words .
$func Find-Unused-Name (e.used-names) e.name = e.unused-name
Функция Find-Unused-Name является вспомогательной для функции Build-CPP-Name .
$func Word-To-CPP-Chars s.word = e.cpp-chars
Функция Word-To-CPP-Chars создает из исходного Рефал-слова s.word строку e.cpp-chars на C++.
$func Chars-To-CPP-Chars e.chars = e.cpp-chars
Функция Chars-To-CPP-Chars из списка символов на Рефале+ e.chars создает список символов на C++ e.cpp-chars.
$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.
$func Expr-Int-To-CPP e.ASAIL-Expr-Int = e.CPP-Expr-Int
Функция Expr-Int-To-CPP преобразует выражение типа Int на АИЯ в соответствующее ему выражение на C++ .
$func Step-To-CPP e.step-operators = e.cpp-step-operators
Функция Step-To-CPP преобразует конструкции инкремента переменной из исходного списка e.step-operators в соответствующие конструкции на C++, которые записываются в список e.cpp-step-operators.
$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.
$func Op-Arg-To-CPP s.op = s.func-for-converting-args-to-cpp
Функция Op-Arg-To-CPP вызывает функцию для обработки знака операции - логической или арифметической.
$func Expr-To-CPP e.ASAIL-expr = e.CPP-Expr
Функция Expr-To-CPP по полученному на входе выражению на абстрактном императивном языке e.ASAIL-Expr строит выражение на языке C++ e.CPP-Expr.
$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
$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.
$func Symbol-To-CPP s.RFP-Symbol = e.CPP-String
Функция Symbol-To-CPP получаeт на входе символ-слово, или символ-литеру, или символ-число s.RFP-Symbol. Символы-числа она переводит в их изображения, а символы-слова и символы-литеры переводит в строку литер на С++ e.CPP-String.
$func Chars-To-CPP e.expr = e.CPP-String
Функция Chars-To-CPP получает на вход цепочку символов-литер e.expr и преобразует его в строку на C++ e.CPP-String.
$func Cond-To-CPP e.cond = e.CPP-Cond
Функция Cond-To-CPP на входе получает выражение-условие на АИЯ e.cond и преобразует его в условие на языке C++ e.CPP-Cond
$func RFP-ASAIL-To-CPP e.asail = e.cpp
Функция RFP-ASAIL-To-CPP получает на входе выражение на АИЯ e.asail и вызывает далее функцию ASAIL-TO-CPP, которая преобразует его в соответствующее выражение на C++ e.cpp.
$table Func-Table
Таблица Func-Table используется для хранения имен функций на Рефале+ и соответствующих им имен на C++.
$table Var-Table
Таблица Var-Table предназначена для хранения имен переменных на Рефале+ и соответствующих им имен на С++, используемых в функции.
$box Func-Names
Ящик Func-Names предназначен для хранения имен функций, построенных в программе.
$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' уникальный идентификатор С++ |