Find file
Fetching contributors…
Cannot retrieve contributors at this time
68 lines (58 sloc) 3.49 KB
-- Модуль построения выражений С++ из выражений HN0 и информации о типах,
-- собранной FFI и модулем вывода типов
--
-- В С++ символ имеет разный синтаксис
-- в зависимости как от вида символа ("квалификатора"), так и от
-- позиции в выражении (позиция функции и позиция аргумента)
--
-- @atomTransformer - функция отображения символа, вместо флага позиции +
-- ветвления по нему используются две функции - CPP.BackendTools.transformFunction и
-- CPP.BackendTooks.transformArgument
--
-- @inferredQualifiers - для каждого символа указан его вид. Информация о видах собирается
-- FFI и модулем компиляции замыканий
--
-- @definitionTypes - выведенные типы символов
ATTR ASTExpression ExpressionList
[ atomTransformer : {CppQualifier -> String -> T -> String -> String} | | ]
ATTR ASTExpression [ isTop : Bool | | sem : CppExpression ]
ATTR ExpressionList [ | | sem USE {:} {[]} : {[CppExpression]} ]
ATTR ASTExpression ASTLetIn [ | | isWhile : Bool ]
SEM ASTExpression
-- в С++ нет дифференциации литералов по типам, и литералы могут быть
-- только на позиции аргумента, поэтому никакой трансляции не
-- требуется
| Constant
lhs.sem = CppLiteral @c
lhs.isWhile = False
| Atom
-- Конструированием атома С++ из атома HN0 занимаются две функции из
-- модуля CPP.BackendTools
--
-- НЕУКЛЮЖЕСТЬ
-- Функции CPP.BackendTools.transformFunction и CPP.BackendTooks.transformArgumentФункции
-- непосредственно конструируют строковое представление атома в С++ вместо
-- конструирования абстрактного представления и делегации десериализации в строку
-- инстансу Show CppExpression из модуля CPP.Visualise
--
lhs.isWhile = @name == "whileF" && @loc.qualifier == CppFqMethod "ff"
loc.qualifier = uncondLookup @name @lhs.qualifiers
lhs.sem = CppAtom $ @lhs.atomTransformer @loc.qualifier @name (uncondLookup @name @lhs.definitionTypes) $ @name ++ xtrace "fixTA" (fixTA @loc.templateArgs @lhs.abstractedTv)
-- аппликация транслируется тоже тривиально
-- для функции и аргумента выставляются соответствующие ФВП обработки
| Application
lhs.isWhile = @lhs.isTop && @fn.isWhile
fn.isTop = False
fn.atomTransformer = transformFunction
arg.atomTransformer = if @lhs.isTop && @fn.isWhile then transformWhile else transformArgument
lhs.sem = CppApplication @fn.sem @arg.sem
SEM ExpressionList
| Cons
hd.isTop = False
SEM ASTLetIn
-- ФВП обработки по умолчанию
-- умолчание нужно, например, для вырожденных значений, содержащих одиночный атом,
-- таких, как, foo = bar
| In
value.atomTransformer = transformArgument
value.isTop = True