Library: work out a treatment for text template substitution (see: #1359)

* establish the feature set to provide
 * choose scheme for runtime representation
 * break down analysis to individual parsing and execution steps
 * conclude which actions to conduct and the necessary data
 * derive the abstract binding API required
This commit is contained in:
Fischlurch 2024-03-19 02:42:43 +01:00
parent af1f549190
commit 5881b014fe
3 changed files with 390 additions and 14 deletions

View file

@ -36,10 +36,15 @@
#include "lib/error.hpp"
#include "lib/nocopy.hpp"
#include "lib/iter-explorer.hpp"
#include "lib/format-util.hpp"
//#include "lib/util.hpp"
//#include <cmath>
//#include <limits>
#include <vector>
#include <string>
//#include <stdint.h>
//#include <boost/rational.hpp>
@ -49,6 +54,79 @@ namespace lib {
// using Rat = boost::rational<int64_t>;
// using boost::rational_cast;
// using std::abs;
using std::string;
namespace {// preconfigured TextTemplate data bindings
}
/**
* Text template substitution engine
*/
class TextTemplate
: util::MoveOnly
{
enum Clause {
IF, FOR
};
enum Code {
TEXT, KEY, COND, JUMP, ITER, LOOP
};
struct ParseCtx
{
Clause clause;
};
struct Action
{
Code code;
string val;
};
template<class BIND>
struct Instance
{
};
using PipeTODO = std::vector<string>;
using InstanceIter = decltype (explore (std::declval<PipeTODO const&>()));
public:
TextTemplate(string spec)
{ }
template<class DAT>
InstanceIter
render (DAT const& data) const;
template<class DAT>
static string
apply (string spec, DAT const& data);
};
/** */
template<class DAT>
inline TextTemplate::InstanceIter
TextTemplate::render (DAT const& data) const
{
UNIMPLEMENTED ("actually instantiate the text template");
}
/** */
template<class DAT>
inline string
TextTemplate::apply (string spec, DAT const& data)
{
return util::join (TextTemplate(spec).render (data)
,"");
}
}// namespace lib

View file

@ -34,6 +34,7 @@
//#include <chrono>
//#include <array>
#include <map>
//using std::array;
@ -41,6 +42,8 @@
namespace lib {
namespace test {
using MapS = std::map<string, string>;
/***************************************************************************//**
* @test verify a minimalistic text substitution engine with flexible
@ -69,12 +72,16 @@ namespace test {
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
/** @test TODO simple point-and-shot usage...
* @todo WIP 4/24 define 🔁 implement
*/
void
simpeUsage()
{
MapS snaps{{"whatever", "cruel world"}
,{"greeting", "farewell"}};
CHECK (TextTemplate::apply ("${greeting} ${whatever} ↯", snaps)
== "farewell cruel world ↯"_expect);
}

View file

@ -112482,8 +112482,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710792595619" ID="ID_1847669087" MODIFIED="1710792697841" TEXT="m&#xf6;gliche weitere Features">
<icon BUILTIN="hourglass"/>
<node CREATED="1710792606209" ID="ID_1610911585" MODIFIED="1710792689754" TEXT="${if ID} ... ${else} ... ${end if ID}"/>
<node CREATED="1710792634661" ID="ID_584250278" MODIFIED="1710792681435" TEXT="${for ID} ... ${else} ... ${end for ID}"/>
<node CREATED="1710792606209" ID="ID_1610911585" MODIFIED="1710805681293" TEXT="${if ID} ... ${else [ID]} ... ${end if ID}"/>
<node CREATED="1710792634661" ID="ID_584250278" MODIFIED="1710805692772" TEXT="${for ID} ... ${else [ID]} ... ${end for ID}"/>
</node>
<node CREATED="1710792708023" ID="ID_19059188" MODIFIED="1710792754654">
<richcontent TYPE="NODE"><html>
@ -112507,18 +112507,63 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793061549" ID="ID_896868325" MODIFIED="1710793066570" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793071787" ID="ID_697532669" MODIFIED="1710793112825" TEXT="Rahmen in lib/text-template.hpp">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793071787" ID="ID_697532669" MODIFIED="1710811850787" TEXT="Rahmen in lib/text-template.hpp">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710809059429" ID="ID_332847297" MODIFIED="1710809198212" TEXT="class TextTemplate">
<icon BUILTIN="pencil"/>
</node>
<node COLOR="#338800" CREATED="1710809189941" ID="ID_392724858" MODIFIED="1710811854998" TEXT="nested definitions">
<icon BUILTIN="button_ok"/>
<node CREATED="1710809213354" ID="ID_206053579" MODIFIED="1710809219589" TEXT="enum Clause"/>
<node CREATED="1710809220249" ID="ID_1049694621" MODIFIED="1710809223876" TEXT="enum Code"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793119597" ID="ID_1328122626" MODIFIED="1710793127228" TEXT="Design">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793135490" ID="ID_1136896163" MODIFIED="1710793273169" TEXT="Binding">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710793135490" ID="ID_1136896163" MODIFIED="1710811869814" TEXT="Binding">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793140948" ID="ID_1992696242" MODIFIED="1710793164256" TEXT="Schema f&#xfc;r Binding anlegen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793148025" ID="ID_1493105822" MODIFIED="1710793163688" TEXT="das Binding-callback-API definieren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793148025" ID="ID_1493105822" MODIFIED="1710811861955" TEXT="das Binding-callback-API definieren">
<icon BUILTIN="button_ok"/>
<node CREATED="1710802871952" ID="ID_1230958115" MODIFIED="1710802881229" TEXT="ben&#xf6;tigte Operationen">
<icon BUILTIN="info"/>
<node CREATED="1710802887262" ID="ID_943892158" MODIFIED="1710803289340" TEXT="DataSrc.retrieveContent(key) &#x27fc; iter"/>
<node CREATED="1710802982433" ID="ID_555113619" MODIFIED="1710803294652" TEXT="DataSrc.handleMiss(key) &#x27fc; iter">
<node CREATED="1710803102126" ID="ID_929049801" MODIFIED="1710803116035" TEXT="liefert einen Ersatz-Content"/>
<node CREATED="1710803122407" ID="ID_1916953854" MODIFIED="1710803131553" TEXT="darf Exception werfen"/>
</node>
<node CREATED="1710803055072" ID="ID_1341021229" MODIFIED="1710803301854" TEXT="DataSrc.getSequence(iter) &#x27fc; iter">
<node CREATED="1710803141876" ID="ID_196999296" MODIFIED="1710803152399" TEXT="interpretiert Content in eine Datensequenz"/>
<node CREATED="1710803153298" ID="ID_1252110387" MODIFIED="1710803171163" TEXT="liefert neuen Iterator &#xfc;ber Sequenz-content"/>
</node>
<node CREATED="1710803215034" ID="ID_1113301675" MODIFIED="1710803311545" TEXT="DataSrc.openContext(iter) &#x27fc; DataSrc">
<node CREATED="1710803369685" ID="ID_530647329" MODIFIED="1710803382976" TEXT="auf dem Sequenz-iter aufgerufen"/>
<node CREATED="1710803384011" ID="ID_186066895" MODIFIED="1710803404991" TEXT="verwandelt diesen in eine verschachtelte Datenquelle"/>
</node>
</node>
<node CREATED="1710803510723" ID="ID_175021668" MODIFIED="1710803517763" TEXT="Datentypen">
<icon BUILTIN="info"/>
<node CREATED="1710803519561" ID="ID_309220322" MODIFIED="1710803523333" TEXT="DataSrc">
<node CREATED="1710803524513" ID="ID_527165239" MODIFIED="1710803549685" TEXT="ein generischer Datentyp (eigentlich das Binding)"/>
<node CREATED="1710803532568" ID="ID_362764880" MODIFIED="1710803540795" TEXT="stellt die o.g. Operationen bereit"/>
<node CREATED="1710803559841" ID="ID_978322266" MODIFIED="1710803571734" TEXT="kann ausgewertet werden um Dateninhalte zu gewinnen"/>
</node>
<node CREATED="1710803573890" ID="ID_331230947" MODIFIED="1710803577253" TEXT="Iter">
<node CREATED="1710803580073" ID="ID_92823392" MODIFIED="1710803623176" TEXT="Auswertungszustand auf der DataSrc"/>
<node CREATED="1710803710216" ID="ID_1903129970" MODIFIED="1710803728139" TEXT="kann dereferenziert werden &#x27fc; string-konvertierbar"/>
<node CREATED="1710803743860" ID="ID_408889688" MODIFIED="1710803759710" TEXT="kann auf &#xbb;Gehalt&#xab; gepr&#xfc;ft werden &#x27fc; bool"/>
<node CREATED="1710803768785" ID="ID_1240137544" MODIFIED="1710803786266" TEXT="kann u.U iteriert werden">
<node CREATED="1710803789014" ID="ID_871294739" MODIFIED="1710803797988" TEXT="findet aber nur in der Sequenz statt"/>
<node CREATED="1710803799133" ID="ID_16257402" MODIFIED="1710803811694" TEXT="nur ein gehaltvoller Iterator darf Iteriert werden"/>
<node CREATED="1710803812469" ID="ID_776439841" MODIFIED="1710803820957" TEXT="nach der Iteration mu&#xdf; erneut auf Gehalt gepr&#xfc;ft werden"/>
</node>
</node>
</node>
<node CREATED="1710803901743" ID="ID_1926090539" MODIFIED="1710803921865" TEXT="jeder Datentyp, welcher diese Eigenschaften bietet, kann als Datenbinding fungieren">
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793579630" ID="ID_1056577943" MODIFIED="1710793609484" TEXT="direktes &#x3bb;-Binding f&#xfc;r Test">
<icon BUILTIN="flag-yellow"/>
@ -112533,6 +112578,21 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800049563" ID="ID_1822369135" MODIFIED="1710800055081" TEXT="Arbeitsprinzip">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710800058362" ID="ID_1054523392" MODIFIED="1710800064259" TEXT="Phase-1 : parsing">
<node CREATED="1710800080064" ID="ID_849138431" MODIFIED="1710800099391" TEXT="Text einmal sequentiell dursuchen"/>
<node CREATED="1710800100004" ID="ID_1541936961" MODIFIED="1710800131459" TEXT="Marker-Tags suchen und extrahieren"/>
<node CREATED="1710800134455" ID="ID_1465453847" MODIFIED="1710800151113" TEXT="einen Stack f&#xfc;r das aktuelle Klammerkonstrukt mitf&#xfc;hren"/>
<node CREATED="1710800158915" ID="ID_143651473" MODIFIED="1710800175677" TEXT="bei jedem Konstrukt den entsprechenden Instanz-Code emittieren"/>
</node>
<node CREATED="1710800066785" ID="ID_4853587" MODIFIED="1710800073593" TEXT="Phase-2 : instance">
<node CREATED="1710800205765" ID="ID_1758922674" MODIFIED="1710800222311" TEXT="den Instanz-Code (zun&#xe4;chst) linear abarbeiten"/>
<node CREATED="1710800266941" ID="ID_1254869121" MODIFIED="1710800324281" TEXT="jede Instruktion interpretieren und dabei einen Kontext-Stack mitf&#xfc;hren"/>
<node CREATED="1710800325188" ID="ID_1194349201" MODIFIED="1710800482644" TEXT="Instruktionen beinhalten ggfs Sprunganweisungen"/>
<node CREATED="1710800342067" ID="ID_596660101" MODIFIED="1710800360272" TEXT="diese adressieren andere Instruktionen per direkter Index-ID"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793189554" ID="ID_1486654440" MODIFIED="1710793220336" TEXT="Template-Processor">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793221783" ID="ID_2381771" MODIFIED="1710793242797" TEXT="Template-Definition">
@ -112546,20 +112606,251 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799898735" ID="ID_965266428" MODIFIED="1710799904120" TEXT="Datenstruktur">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799920412" ID="ID_908650592" MODIFIED="1710800023758" TEXT="parsing">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800526514" ID="ID_989913764" MODIFIED="1710805322868" TEXT="aufzubauender InstaceCode">
<arrowlink COLOR="#435183" DESTINATION="ID_983120521" ENDARROW="Default" ENDINCLINATION="115;-21;" ID="Arrow_ID_322992252" STARTARROW="None" STARTINCLINATION="129;12;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800552767" ID="ID_1521047609" MODIFIED="1710800582043" TEXT="begleitender ClauseStack">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710805340319" ID="ID_562049748" MODIFIED="1710809644676" TEXT="clause-IF">
<node CREATED="1710805427820" ID="ID_926529537" MODIFIED="1710805430543" TEXT="key"/>
<node CREATED="1710805433691" ID="ID_140538867" MODIFIED="1710805448452" TEXT="condIDX"/>
<node CREATED="1710805901972" ID="ID_1925361658" MODIFIED="1710805904520" TEXT="elseIDX"/>
</node>
<node CREATED="1710806293792" ID="ID_1243912941" MODIFIED="1710809647520" TEXT="clause-FOR">
<node CREATED="1710806297592" ID="ID_552040953" MODIFIED="1710806301595" TEXT="key"/>
<node CREATED="1710806431286" ID="ID_1758494267" MODIFIED="1710806433649" TEXT="iterIDX"/>
<node CREATED="1710806569891" ID="ID_45141321" MODIFIED="1710806764349" TEXT="loopIDX"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799932570" ID="ID_313850038" MODIFIED="1710799946174" TEXT="intance">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800587002" ID="ID_983120521" MODIFIED="1710805322868" TEXT="abzuarbeitender InstanceCode">
<linktarget COLOR="#435183" DESTINATION="ID_983120521" ENDARROW="Default" ENDINCLINATION="115;-21;" ID="Arrow_ID_322992252" SOURCE="ID_989913764" STARTARROW="None" STARTINCLINATION="129;12;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710800768234" ID="ID_59072753" MODIFIED="1710800773373" TEXT="Primitive">
<node CREATED="1710800778608" ID="ID_1425870712" MODIFIED="1710800781499" TEXT="text">
<node CREATED="1710801294036" ID="ID_321691659" MODIFIED="1710801330242" TEXT="content"/>
</node>
<node CREATED="1710800801936" ID="ID_997676683" MODIFIED="1710800853266" TEXT="key">
<node CREATED="1710801289060" ID="ID_223601519" MODIFIED="1710801291323" TEXT="key"/>
</node>
<node CREATED="1710801180027" ID="ID_105291406" MODIFIED="1710801182195" TEXT="cond">
<node CREATED="1710801184330" ID="ID_1079049307" MODIFIED="1710801187853" TEXT="key"/>
<node CREATED="1710801188841" ID="ID_492324938" MODIFIED="1710802154340" TEXT="elseIDX"/>
</node>
<node CREATED="1710801271318" ID="ID_805760178" MODIFIED="1710801281201" TEXT="jump">
<node CREATED="1710801282309" ID="ID_1061395631" MODIFIED="1710802150970" TEXT="afterIDX"/>
</node>
<node CREATED="1710801902394" ID="ID_1476632890" MODIFIED="1710801904381" TEXT="iter">
<node CREATED="1710801912661" ID="ID_1516458611" MODIFIED="1710801946320" TEXT="key"/>
<node CREATED="1710801948020" ID="ID_1206821953" MODIFIED="1710802138871" TEXT="elseIDX"/>
</node>
<node CREATED="1710801963210" ID="ID_354341296" MODIFIED="1710801965797" TEXT="loop">
<node CREATED="1710802125863" ID="ID_218938558" MODIFIED="1710802136638" TEXT="beginIDX"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800605488" ID="ID_1639197274" MODIFIED="1710800613813" TEXT="begleitender ContextStack">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710802175845" ID="ID_838839444" MODIFIED="1710802179664" TEXT="State">
<node CREATED="1710802209121" ID="ID_1872142339" MODIFIED="1710802224187" TEXT="nested DataSrc"/>
<node CREATED="1710802225814" ID="ID_155578503" MODIFIED="1710802245296" TEXT="evaluationState"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710809327978" ID="ID_278831608" MODIFIED="1710809383069" TEXT="Implementierungs-Datentypen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710809339961" ID="ID_689101433" MODIFIED="1710809343260" TEXT="enum Clause"/>
<node CREATED="1710809343987" ID="ID_1483329962" MODIFIED="1710809347034" TEXT="enum Code"/>
<node CREATED="1710809347760" ID="ID_1225629738" MODIFIED="1710809361714" TEXT="struct ParseCtx"/>
<node CREATED="1710810113497" ID="ID_1468035459" MODIFIED="1710810122668" TEXT="struct Action"/>
<node CREATED="1710809364702" ID="ID_1039397469" MODIFIED="1710809374320" TEXT="struct Instance&lt;Binding&gt;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799996889" ID="ID_1910948400" MODIFIED="1710800002425" TEXT="Processing">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799920412" ID="ID_1195498496" MODIFIED="1710800023758" TEXT="parsing">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710804975672" ID="ID_1778438879" MODIFIED="1710804998137" TEXT="Reg-Exp-Iteration auf die Tag-Syntax"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710804999413" ID="ID_670708059" MODIFIED="1710805006332" TEXT="handzuhabende Situationen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710805054381" ID="ID_1600465677" MODIFIED="1710805058600" TEXT="erstes Tag">
<node CREATED="1710805070796" ID="ID_19487824" MODIFIED="1710805126616" TEXT="vorausgehender Text als text-Code emittieren"/>
<node CREATED="1710805127396" ID="ID_1769703452" MODIFIED="1710805138230" TEXT="rekursiver Aufruf"/>
</node>
<node CREATED="1710805094112" ID="ID_1981750216" MODIFIED="1710805100142" TEXT="Platzhalter">
<node CREATED="1710805110670" ID="ID_1186940443" MODIFIED="1710805122102" TEXT="key-Code emittieren"/>
</node>
<node CREATED="1710805159120" ID="ID_966003839" MODIFIED="1710805161851" TEXT="if ID">
<node CREATED="1710805210794" ID="ID_1447898531" MODIFIED="1710805218710" TEXT="cond-Code mit key emittieren"/>
<node CREATED="1710805219728" ID="ID_373857285" MODIFIED="1710809681135" TEXT="push clause(IF)">
<node CREATED="1710805249556" ID="ID_1366141121" MODIFIED="1710805254583" TEXT="enth&#xe4;lt den Key"/>
<node CREATED="1710805255123" ID="ID_1075707089" MODIFIED="1710805271261" TEXT="enth&#xe4;lt den IDX des soeben emittierten Starters"/>
</node>
</node>
<node CREATED="1710805510953" ID="ID_1232635083" MODIFIED="1710809697061" TEXT="else &#x2227; Stack-Top &#x27fc; clause-IF">
<node CREATED="1710805771222" ID="ID_1862652580" MODIFIED="1710809703436" TEXT="Zugriff via clause-IF.condIDX"/>
<node CREATED="1710805749865" ID="ID_40408302" MODIFIED="1710805770154" TEXT="elseIDX in condCode schreiben"/>
<node CREATED="1710805829022" ID="ID_495973445" MODIFIED="1710805843264" TEXT="jump-Code emittieren (jump-target leer)"/>
<node CREATED="1710805869320" ID="ID_1903636142" MODIFIED="1710809711798" TEXT="aktuellen (else/jump)IDX in die clause-IF schreiben"/>
</node>
<node CREATED="1710805928769" ID="ID_1002261040" MODIFIED="1710805938279" TEXT="end if ID">
<node CREATED="1710805952222" ID="ID_1751436972" MODIFIED="1710809716506" TEXT="pr&#xfc;fen: Stack-Top &#x27fc; clause-IF mit passender ID"/>
<node CREATED="1710806088475" ID="ID_1503372396" MODIFIED="1710809720258" TEXT="Zugriff via clause-IF.elseIDX">
<arrowlink COLOR="#6455aa" DESTINATION="ID_952557558" ENDARROW="Default" ENDINCLINATION="112;-9;" ID="Arrow_ID_1645155125" STARTARROW="None" STARTINCLINATION="103;11;"/>
</node>
<node CREATED="1710806120310" ID="ID_113535239" MODIFIED="1710806148751" TEXT="aktuell n&#xe4;chsten IDX in jump.afterIDX schreiben"/>
<node CREATED="1710806211723" ID="ID_544563630" MODIFIED="1710806216422" TEXT="(nichts zu emittieren)"/>
<node CREATED="1710806196725" ID="ID_1695937501" MODIFIED="1710806201560" TEXT="Stack pop"/>
</node>
<node CREATED="1710807375799" ID="ID_952557558" MODIFIED="1710807485995" TEXT="end if ID &#x2227; elseIDX noch leer">
<linktarget COLOR="#6455aa" DESTINATION="ID_952557558" ENDARROW="Default" ENDINCLINATION="112;-9;" ID="Arrow_ID_1645155125" SOURCE="ID_1503372396" STARTARROW="None" STARTINCLINATION="103;11;"/>
<node CREATED="1710807400300" ID="ID_1849343250" MODIFIED="1710807950556" TEXT="Spezialfall &#x27f9; single-branch IF">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1710807616439" ID="ID_1525985296" MODIFIED="1710807629569" TEXT="aktuell n&#xe4;chsten IDX in cond.elseIDX schreiben "/>
<node CREATED="1710807639284" ID="ID_1610786686" MODIFIED="1710807648431" TEXT="(nichts zu emittieren)"/>
<node CREATED="1710807649211" ID="ID_1724244138" MODIFIED="1710807651982" TEXT="Stack pop"/>
</node>
<node CREATED="1710806240319" ID="ID_21539921" MODIFIED="1710806243387" TEXT="for ID">
<node CREATED="1710806265628" ID="ID_1120675972" MODIFIED="1710806271623" TEXT="iter-Code mit kex emittieren"/>
<node CREATED="1710806276683" ID="ID_1007095460" MODIFIED="1710809759109" TEXT="push clause-FOR">
<node CREATED="1710806367675" ID="ID_1074384173" MODIFIED="1710806371937" TEXT="enth&#xe4;lt den Key"/>
<node CREATED="1710806375389" ID="ID_1970731379" MODIFIED="1710806384327" TEXT="enth&#xe4;lt den IDX des soeben emittierten Starters"/>
</node>
</node>
<node CREATED="1710806405673" ID="ID_1310523006" MODIFIED="1710806408164" TEXT="else &#x2227; Stack-Top &#x27fc; clauseIT">
<node CREATED="1710806493641" ID="ID_1459454155" MODIFIED="1710809753965" TEXT="Zugriff via clause-FOR.iterIDX"/>
<node CREATED="1710806509686" ID="ID_1028209132" MODIFIED="1710806516550" TEXT="elseIDX in iterCode schreiben"/>
<node CREATED="1710806533512" ID="ID_1807003849" MODIFIED="1710806538211" TEXT="loop-Code emittieren"/>
<node CREATED="1710806552007" ID="ID_354718435" MODIFIED="1710809748470" TEXT="iterIDX aus der clause-FOR in den loop-Code &#xfc;bertragen"/>
<node CREATED="1710808973802" ID="ID_21613324" MODIFIED="1710808986148" TEXT="jump-Code emittieren"/>
<node CREATED="1710806706513" ID="ID_899347616" MODIFIED="1710806717967" TEXT="(afterIDX) bleibt noch leer"/>
<node CREATED="1710806777807" ID="ID_700983662" MODIFIED="1710809774227" TEXT="aktuellen (jump)IDX in die clause-FOR schreiben"/>
</node>
<node CREATED="1710806821425" ID="ID_1990562028" MODIFIED="1710806827725" TEXT="end for ID">
<node CREATED="1710806838975" ID="ID_400001835" MODIFIED="1710809782658" TEXT="pr&#xfc;fen: Stack-Top &#x27fc; clause-FOR mit passender ID "/>
<node CREATED="1710806870554" ID="ID_1872952395" MODIFIED="1710809796838" TEXT="Zugriff via clause-FOR.loopIDX">
<arrowlink COLOR="#6c5999" DESTINATION="ID_905517349" ENDARROW="Default" ENDINCLINATION="116;-16;" ID="Arrow_ID_130125525" STARTARROW="None" STARTINCLINATION="108;10;"/>
</node>
<node CREATED="1710806926394" ID="ID_1821893125" MODIFIED="1710806947252" TEXT="aktuell n&#xe4;chsten IDX in loop.afterIDX schreiben"/>
<node CREATED="1710807230043" ID="ID_877544642" MODIFIED="1710807234878" TEXT="(nichts zu emittieren)"/>
<node CREATED="1710807235490" ID="ID_598110285" MODIFIED="1710807239243" TEXT="Stack pop"/>
</node>
<node CREATED="1710807760468" ID="ID_905517349" MODIFIED="1710809796838" TEXT="end for ID &#x2227; loopIDX noch leer">
<linktarget COLOR="#6c5999" DESTINATION="ID_905517349" ENDARROW="Default" ENDINCLINATION="116;-16;" ID="Arrow_ID_130125525" SOURCE="ID_1872952395" STARTARROW="None" STARTINCLINATION="108;10;"/>
<node CREATED="1710807934204" ID="ID_1858173028" MODIFIED="1710807947404" TEXT="Spezialfall &#x27f9; Loop ohne else">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1710808089696" ID="ID_1816040949" MODIFIED="1710808100290" TEXT="loop-Code emittieren"/>
<node CREATED="1710808688599" ID="ID_1119725509" MODIFIED="1710809807726" TEXT="Zugriff via clause-FOR.iterIDX"/>
<node CREATED="1710808120500" ID="ID_168022679" MODIFIED="1710809815174" TEXT="iterIDX aus der clause-FOR in den loop-Code &#xfc;bertragen "/>
<node CREATED="1710808166910" ID="ID_1300637456" MODIFIED="1710809030190" TEXT="(keinen weiteren jump-Code emittieren)"/>
<node CREATED="1710807235490" ID="ID_1468993776" MODIFIED="1710807239243" TEXT="Stack pop"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799932570" ID="ID_1103663065" MODIFIED="1710799946174" TEXT="intance">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800667346" ID="ID_299824445" MODIFIED="1710800700515" TEXT="handzuhabende Situationen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710800705306" ID="ID_906431564" MODIFIED="1710800711869" TEXT="literaler Textblock">
<node CREATED="1710800725888" ID="ID_1235186459" MODIFIED="1710800731914" TEXT="Text liegt im Speicher"/>
<node CREATED="1710800732695" ID="ID_777704048" MODIFIED="1710800741009" TEXT="wird in die Ausgabe &#xfc;bertragen"/>
</node>
<node CREATED="1710800787373" ID="ID_1077539392" MODIFIED="1710800799529" TEXT="einfacher Platzhalter">
<node CREATED="1710800908415" ID="ID_1239575187" MODIFIED="1710800920805" TEXT="content-retrieval by key"/>
<node CREATED="1710800923037" ID="ID_681363276" MODIFIED="1710800939271" TEXT="missing-handler"/>
<node CREATED="1710800939834" ID="ID_1283509869" MODIFIED="1710800945313" TEXT="transfer to output"/>
</node>
<node CREATED="1710800985467" ID="ID_1738451953" MODIFIED="1710801003930" TEXT="Beginn conditional">
<node CREATED="1710801008828" ID="ID_1249620465" MODIFIED="1710801016817" TEXT="content-retrieval by key"/>
<node CREATED="1710801019256" ID="ID_460082886" MODIFIED="1710801034122" TEXT="bool evaluation"/>
<node CREATED="1710801035982" ID="ID_743080453" MODIFIED="1710807359005" TEXT="false &#x27f9; jump to else/after-content"/>
</node>
<node CREATED="1710801201142" ID="ID_1826208607" MODIFIED="1710801226280" TEXT="Ende cond-true-Block">
<node CREATED="1710801231297" ID="ID_451436855" MODIFIED="1710801263363" TEXT="jump to content after conditional"/>
</node>
<node CREATED="1710801338037" ID="ID_864477992" MODIFIED="1710801346664" TEXT="Ende cond-else-block">
<node CREATED="1710801347676" ID="ID_345168244" MODIFIED="1710801351618" TEXT="nichts zu tun"/>
<node CREATED="1710801352347" ID="ID_1875977491" MODIFIED="1710801358702" TEXT="mu&#xdf; daher nicht repr&#xe4;sentiert werden"/>
</node>
<node CREATED="1710801361370" ID="ID_897783542" MODIFIED="1710801898812" TEXT="Beginn Iteration">
<node CREATED="1710801378394" ID="ID_1033559705" MODIFIED="1710801412767" TEXT="content-retrieval by key"/>
<node CREATED="1710801417147" ID="ID_1408892944" MODIFIED="1710801477638" TEXT="start content-evaluation"/>
<node CREATED="1710801478482" ID="ID_1960402684" MODIFIED="1710801574417" TEXT="further content available?"/>
<node CREATED="1710801579485" ID="ID_23058821" MODIFIED="1710805564766" TEXT="true &#x27f9; push nested context ; continue with loop content"/>
<node CREATED="1710801620407" ID="ID_623818855" MODIFIED="1710807351948" TEXT="false &#x27f9; no nested context ; jump to else/after-content"/>
</node>
<node CREATED="1710801647364" ID="ID_112069175" MODIFIED="1710801680283" TEXT="Loop-turn">
<node CREATED="1710801709939" ID="ID_791166881" MODIFIED="1710801715318" TEXT="re-access content-evaluation"/>
<node CREATED="1710801720458" ID="ID_1918287018" MODIFIED="1710801724653" TEXT="iterate content"/>
<node CREATED="1710801726097" ID="ID_336459864" MODIFIED="1710801732164" TEXT="further content available?"/>
<node CREATED="1710801736120" ID="ID_192397143" MODIFIED="1710805570164" TEXT="true &#x27f9; open content ; jump to loop content"/>
<node CREATED="1710801785474" ID="ID_800375943" MODIFIED="1710805576940" TEXT="false &#x27f9; pop nsted content ; jump to content after loop"/>
</node>
<node CREATED="1710806989587" ID="ID_1498168313" MODIFIED="1710807003125" TEXT="Ende Iteration-else">
<node CREATED="1710807154373" ID="ID_1583286685" MODIFIED="1710807157096" TEXT="nichts zu tun"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710802324329" ID="ID_431802587" MODIFIED="1710802329041" TEXT="funktionale Elemente">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710802404231" ID="ID_417674931" MODIFIED="1710802420784" TEXT="active DataSrc"/>
<node CREATED="1710802472877" ID="ID_1932723676" MODIFIED="1710802476682" TEXT="active Element">
<node CREATED="1710802550515" ID="ID_900437708" MODIFIED="1710802555782" TEXT="typischerweise ein Iterator"/>
</node>
<node CREATED="1710802563385" ID="ID_1981041075" MODIFIED="1710802569029" TEXT="evaluator">
<node CREATED="1710802570304" ID="ID_348663664" MODIFIED="1710802576155" TEXT="empty-detector"/>
<node CREATED="1710802648966" ID="ID_307257971" MODIFIED="1710802653691" TEXT="sequence-extractor"/>
</node>
<node CREATED="1710802684313" ID="ID_1755236197" MODIFIED="1710802692132" TEXT="currInstruction">
<node CREATED="1710802696248" ID="ID_1500495122" MODIFIED="1710802702482" TEXT="der instruction pointer"/>
<node CREATED="1710802707078" ID="ID_1676117590" MODIFIED="1710802716696" TEXT="ist zuweisbar (random-access)"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793352301" ID="ID_1691061928" MODIFIED="1710793355254" TEXT="Bindings">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793356309" ID="ID_618241969" MODIFIED="1710793358557" TEXT="Map">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710804031539" ID="ID_1692068622" MODIFIED="1710804061062" TEXT="der Inhaltstyp wird auf via util::toString() zugegriffen"/>
<node CREATED="1710804062496" ID="ID_377899149" MODIFIED="1710804093937" TEXT="DataSrc ist ein generischer Wrapper um die Map"/>
<node CREATED="1710804167972" ID="ID_200600045" MODIFIED="1710804186992" TEXT="der Iterator ist eine String-View (ein String-Range)"/>
<node CREATED="1710804197208" ID="ID_709716942" MODIFIED="1710804233519" TEXT="Sequenz-Auswertung interpretiert den String als CSV-Zeile"/>
<node CREATED="1710804454510" ID="ID_835685377" MODIFIED="1710804469839" TEXT="die einzelnen Datenelemente werden als Key-Pr&#xe4;fix interpretiert"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1710804234267" ID="ID_226073889" MODIFIED="1710804261633" TEXT="Verschachtelung wird nicht unterst&#xfc;tzt">
<icon BUILTIN="yes"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1710804264759" ID="ID_1288259029" MODIFIED="1710804281745" TEXT="das bedeutet: die Daten m&#xfc;ssen eben dementsprechend strukturiert sein"/>
<node CREATED="1710804473275" ID="ID_1177047190" MODIFIED="1710804522912" TEXT="ein verschachtelter Kontext mu&#xdf; Keys referenzieren, die anderweitig in der Map vorhanden sind"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710804833930" ID="ID_1766619477" MODIFIED="1710804839987" TEXT="Test-Binding">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710804841699" ID="ID_933127899" MODIFIED="1710804917699" TEXT="eine String-Spec mit kommaseparierten key=val -Literalen"/>
<node CREATED="1710804918648" ID="ID_1642910022" MODIFIED="1710804947480" TEXT="wird einmal geparst und in eine Map gepackt &#x27f6; Map-Binding"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793367246" ID="ID_1695880616" MODIFIED="1710793369256" TEXT="ETD">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710804556008" ID="ID_1997691101" MODIFIED="1710804588772" TEXT="DataSrc ist ein Rec&lt;GenNode&gt;"/>
<node CREATED="1710804591691" ID="ID_1815976275" MODIFIED="1710804603973" TEXT="Key-Zugriff wird &#xfc;bersetzt in Attribut-Zugriff"/>
<node CREATED="1710804616944" ID="ID_538897899" MODIFIED="1710804626706" TEXT="Iteration wird &#xfc;bersetzt in Scope-Iteration"/>
<node CREATED="1710804633837" ID="ID_1119504137" MODIFIED="1710804648600" TEXT="jedes Element im Scope ist wieder ein Rec&lt;GenNode&gt;"/>
<node CREATED="1710804715954" ID="ID_1537394187" MODIFIED="1710804736900" TEXT="diese Elemente k&#xf6;nnen aber leer sein (wegen Parent-Delegation)"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793091784" ID="ID_1970381008" MODIFIED="1710793100312" TEXT="TextTemplate_test">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793387393" ID="ID_413372443" MODIFIED="1710793391297" TEXT="simpeUsage">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710793091784" ID="ID_1970381008" MODIFIED="1710811906348" TEXT="TextTemplate_test">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710793387393" ID="ID_413372443" MODIFIED="1710811903746" TEXT="simpeUsage">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793507744" ID="ID_1535977723" MODIFIED="1710793518661" TEXT="verify_instantiation">
<icon BUILTIN="flag-yellow"/>