Т-Рефал

Описание реализации T-Refal'а - Refal'а на OpenTS.

Представление данных (trefal.hh)

Expr - Рефал-выражение. Представлено массивом Term'ов:
class Expr : private ts::TExtData {
    bool is_const;
    Term* terms;
    ...
}
Длина массива хранится в ts::TExtData - т.к. длина должна быть доступна OpenTS: метод extDataSize() возращает ссылку (&), в которую можно записать длину объекта или ее прочитать.
В Expr определены все операции с выражениями: взятие подвыражение, конкатенация и прочее.

Term - Рефал-терм. Может быть символом, числом или выражением (в скобках):
struct Term {
    enum Type {
        CHAR, INT, EXPR, CONST
    } type;
    int data;
    TExpr e;
    ...
}

TExpr - T-ссылка на Expr. Т.е. указатель на выражение, которое может находится на другом узле. При приведении TExpr и Expr происходит передача Expr с узла на узел.
class TExpr : public ts::TVar<Expr> {
    ...
}

Компиляция функций в T-Refal

Компиляция происходит стандартным образом (как и в C++ или Java), только приходится преобразовывать Expr в TExpr и обратно. Пример.
Comments