Library: implementation of syntax-branching

...is now easy and follows entirely the scheme established thus far
This commit is contained in:
Fischlurch 2025-01-22 02:21:39 +01:00
parent e3fe8fe380
commit 1a3781bbc0
3 changed files with 194 additions and 31 deletions

View file

@ -320,6 +320,41 @@ namespace util {
}
/** accept sequence of two parse functions */
template<class C1, class C2>
auto
branchedConnex (C1&& connex1, C2&& connex2)
{
using R1 = typename decay_t<C1>::Result;
using R2 = typename decay_t<C2>::Result;
using SumResult = typename _Join<AltModel, R1, R2>::Result;
using SumEval = Eval<SumResult>;
return Connex{[conL = forward<C1>(connex1)
,conR = forward<C2>(connex2)
]
(StrView toParse) -> SumEval
{
auto eval1 = conL.parse (toParse);
if (eval1.result)
{
uint endBranch1 = eval1.consumed;
return SumEval{SumResult::mark_left (move(*eval1.result))
,endBranch1
};
}
auto eval2 = conR.parse (toParse);
if (eval2.result)
{
uint endBranch2 = eval2.consumed;
return SumEval{SumResult::mark_right (move(*eval2.result))
,endBranch2
};
}
return SumEval{std::nullopt};
}};
}
template<class PAR>
class Syntax;
@ -427,6 +462,15 @@ using Sigi = typename _Fun<PFun>::Sig;
,Parser{forward<SPEC> (clauseDef)}));
}
template<typename SPEC>
auto
alt (SPEC&& clauseDef)
{
return accept(
branchedConnex (move(parse_)
,Parser{forward<SPEC> (clauseDef)}));
}
private:
Eval<Result>&
eval()

View file

@ -135,10 +135,17 @@ namespace test {
}
/** @test define a sequence of syntax structures to match by parse. */
/** @test define a sequence of syntax structures to match by parse.
* - first demonstrate explicitly how the consecutive parsing works
* and how both models are combined into a product model (tuple)
* - demonstrate how leading whitespace is skipped automatically
* - then perform the same parse with a Syntax clause build with
* the `seq()` builder-DSL
* - extend this Syntax by adding a further sequential clause.
*/
void
acceptSequential()
{
{ //_______________________________________________
// Demonstration: how sequence combinator works....
auto term1 = buildConnex ("hello");
auto term2 = buildConnex ("world");
@ -185,6 +192,7 @@ namespace test {
CHECK (not term2.parse(" old ").result);
//___________________________________________________
// DSL parse clause builder: a sequence of terminals...
auto syntax = accept("hello").seq("world");
@ -213,9 +221,12 @@ namespace test {
}
/** @test TODO WIP define alternative syntax structures to match by parse.
* - first demonstrate how a model with alternative branches can be
* populated and gradually extended while searching for a match.
* - then show explicitly the logic to check and select branches
* and construct the corresponding sum-model (variant)
*/
void
acceptAlternatives()
@ -293,7 +304,42 @@ namespace test {
CHECK (e2.result->selected() == 0); // Selector-ID of the first matching branch (here #0)
CHECK (e2.result->get<0>().str() == "brazen"); // We know that branch#0 holds a RegExp-Matcher (from term1)
CHECK (e2.result->get<0>().suffix() == " dicktator");
}
CHECK (e2.consumed == 6);
CHECK (s2.substr(e2.consumed) == " dicktator");
//________________________________________________
// DSL parse clause builder: alternative branches...
auto syntax = accept("brazen").alt("bragging");
// Perform the same parse as demonstrated above....
CHECK (not syntax.hasResult());
syntax.parse(s1);
CHECK (not syntax.success());
syntax.parse(s2);
CHECK (syntax);
auto altModel = syntax.getResult();
CHECK (altModel.selected() == 0);
CHECK (altModel.get<0>().str() == "brazen");
// can build extended clause from existing one
auto syntax2 = syntax.alt("smarmy (\\w+)");
CHECK (not syntax2.hasResult());
syntax2.parse(s1);
CHECK (not syntax2.success());
syntax2.parse(s2);
CHECK (syntax2.success());
CHECK (syntax2.getResult().TOP == 2); // Note: further branch has been folded into an extended AltModel
CHECK (syntax2.getResult().selected() == 0); // ... string s2 still matched the same branch (#0)
CHECK (syntax2.getResult().get<0>().str() == "brazen");
syntax2.parse("smarmy saviour");
CHECK (syntax2.success());
auto altModel2 = syntax2.getResult();
CHECK (syntax2.getResult().selected() == 2); // ... but another string can match the added branch #2
CHECK (syntax2.getResult().get<2>().str() == "smarmy saviour");
CHECK (syntax2.getResult().get<2>().str(1) == "saviour");
} // Note: syntax for this branch #2 captured an additional word
};
LAUNCHER (Parse_test, "unit common");

View file

@ -55532,8 +55532,9 @@
</node>
</node>
</node>
<node CREATED="1736946825696" ID="ID_272711066" MODIFIED="1736946834898" TEXT="Model-Increment">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736947018560" ID="ID_251061074" MODIFIED="1737048260215" TEXT="Implementierungstechnik kl&#xe4;ren">
<node COLOR="#338800" CREATED="1736946825696" ID="ID_272711066" MODIFIED="1737511471619" TEXT="Model-Increment">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1736947018560" ID="ID_251061074" MODIFIED="1737511474738" TEXT="Implementierungstechnik kl&#xe4;ren">
<linktarget COLOR="#47839d" DESTINATION="ID_251061074" ENDARROW="Default" ENDINCLINATION="-14;-71;" ID="Arrow_ID_1227279766" SOURCE="ID_106647279" STARTARROW="None" STARTINCLINATION="-108;6;"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1736947190134" ID="ID_1146338669" MODIFIED="1737234426676" TEXT="es gibt dedizierte Funktionen f&#xfc;r jede der drei Junktoren">
@ -55579,7 +55580,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736968942247" ID="ID_917376104" MODIFIED="1736984817920" TEXT="mu&#xdf; Anfangswert der Fold-Sequenz explizit konstruieren">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#380f69" CREATED="1736968942247" ID="ID_917376104" MODIFIED="1737511498798" TEXT="mu&#xdf; Anfangswert der Fold-Sequenz explizit konstruieren">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1736971224510" ID="ID_1155045892" MODIFIED="1736972005211" TEXT="das kann aber durch Binding-Komposition realisiert werden">
<richcontent TYPE="NOTE"><html>
<head/>
@ -55590,7 +55592,7 @@
</body>
</html></richcontent>
</node>
<node CREATED="1736984900441" ID="ID_1840258579" MODIFIED="1737048113171" TEXT="Aufgabe: &#xab;Subexpression&#xbb; von &#xab;Fortsetzung&#xbb; unterscheiden">
<node COLOR="#435e98" CREATED="1736984900441" ID="ID_1840258579" MODIFIED="1737511578229" TEXT="Aufgabe: &#xab;Subexpression&#xbb; von &#xab;Fortsetzung&#xbb; unterscheiden">
<linktarget COLOR="#af6c89" DESTINATION="ID_1840258579" ENDARROW="Default" ENDINCLINATION="189;-10;" ID="Arrow_ID_290406639" SOURCE="ID_1725950802" STARTARROW="None" STARTINCLINATION="127;9;"/>
<node CREATED="1736985415812" HGAP="40" ID="ID_1711795730" MODIFIED="1736985424657" TEXT="Analyse" VSHIFT="24">
<icon BUILTIN="yes"/>
@ -55745,14 +55747,15 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736988419593" ID="ID_364383845" MODIFIED="1736988437151" TEXT="Pattern-Match und Spezialfall-Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1736988419593" ID="ID_364383845" MODIFIED="1737511653707" TEXT="Pattern-Match und Spezialfall-Implementierung">
<icon BUILTIN="pencil"/>
<node CREATED="1736988439351" ID="ID_396611819" MODIFIED="1736988490982" TEXT="verwende ein explizit definiertes Tag: Sub&lt;X&gt;"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1736988542489" ID="ID_1635129166" MODIFIED="1737234629319" TEXT="Model-Join extrahieren">
<arrowlink COLOR="#465acd" DESTINATION="ID_226754618" ENDARROW="Default" ENDINCLINATION="-418;52;" ID="Arrow_ID_1636406845" STARTARROW="None" STARTINCLINATION="-11;79;"/>
<icon BUILTIN="yes"/>
<node CREATED="1736989303802" ID="ID_343321438" MODIFIED="1736989337762" TEXT="k&#xfc;nstlichen Overlay-(Sub)-Typ mit pr&#xe4;parierten ctor-Varianten"/>
<node CREATED="1736989524517" ID="ID_1328191899" MODIFIED="1736989546365" TEXT="wir verwenden also f&#xfc;r alle F&#xe4;lle noch ein Type-Tag">
<node COLOR="#435e98" CREATED="1736989524517" ID="ID_1328191899" MODIFIED="1737511798295" TEXT="wir verwenden also f&#xfc;r alle F&#xe4;lle noch ein Type-Tag">
<icon BUILTIN="idea"/>
<node CREATED="1736989550865" ID="ID_1529698419" MODIFIED="1736989681361" TEXT="hey ... jetzt wird die Sache doch noch symmetrisch">
<arrowlink COLOR="#883543" DESTINATION="ID_430898447" ENDARROW="Default" ENDINCLINATION="23;81;" ID="Arrow_ID_986870112" STARTARROW="Default" STARTINCLINATION="-37;-77;"/>
<node CREATED="1737047917423" ID="ID_1722748785" MODIFIED="1737047922311" TEXT="">
@ -55772,7 +55775,7 @@
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1736990597339" ID="ID_116496774" MODIFIED="1736990620329" TEXT="wo / wie werden die verschiedenen Tags / F&#xe4;lle eingebracht?">
<node COLOR="#435e98" CREATED="1736990597339" ID="ID_116496774" MODIFIED="1737511779877" TEXT="wo / wie werden die verschiedenen Tags / F&#xe4;lle eingebracht?">
<icon BUILTIN="help"/>
<node CREATED="1736990622625" ID="ID_1156223319" MODIFIED="1736990757955" TEXT="statt &quot;Join&quot; dann &quot;Seq&quot;, &quot;Alt&quot;, &quot;Iter&quot;, Sub verwenden?"/>
<node CREATED="1736990655365" ID="ID_1974103277" MODIFIED="1736990774257" TEXT="oder die Tag-Typen nennen: &quot;SeqModel&quot;, &quot;AltModel&quot;, &quot;IterModel&quot;, &quot;SubModel&quot;"/>
@ -55780,9 +55783,14 @@
<node CREATED="1736990864084" ID="ID_1562357541" MODIFIED="1736990882866" TEXT="also z.B. _Join&lt;SeqModel, R1, R2&gt;::Result"/>
<node CREATED="1736990997055" ID="ID_814902476" MODIFIED="1736991012369" TEXT="explizite Spezialisierungen als Fallunterscheidung"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#480f69" CREATED="1737511768536" ID="ID_1523530760" MODIFIED="1737511789015" TEXT="das bew&#xe4;hrt sich gut">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1736991166384" ID="ID_226754618" MODIFIED="1737234614712" TEXT="Fallkombinationen">
</node>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1736991166384" ID="ID_226754618" MODIFIED="1737511947153" TEXT="Fallkombinationen">
<linktarget COLOR="#465acd" DESTINATION="ID_226754618" ENDARROW="Default" ENDINCLINATION="-418;52;" ID="Arrow_ID_1636406845" SOURCE="ID_1635129166" STARTARROW="None" STARTINCLINATION="-11;79;"/>
<linktarget COLOR="#579bd2" DESTINATION="ID_226754618" ENDARROW="Default" ENDINCLINATION="6;427;" ID="Arrow_ID_220186183" SOURCE="ID_209338146" STARTARROW="None" STARTINCLINATION="1852;-83;"/>
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
<node CREATED="1736991171271" ID="ID_1748513219" MODIFIED="1736991211262" TEXT="_Join&lt;TAG,R1,R2&gt; &#x27fc; TAG&lt;R1,R2&gt;">
<node CREATED="1736991696404" ID="ID_564129640" MODIFIED="1736991706911" TEXT="das impliziert bereits den Tag-Wechsel">
@ -55820,12 +55828,14 @@
</node>
<node CREATED="1737234537803" ID="ID_337495209" MODIFIED="1737234551785" TEXT="Alternative">
<icon BUILTIN="info"/>
<node COLOR="#435e98" CREATED="1737511663681" ID="ID_1937626624" MODIFIED="1737511740655" TEXT="akzeptiere zwei Werte &#x27f6; neues AltModel"/>
<node COLOR="#435e98" CREATED="1737511691172" ID="ID_1192322879" MODIFIED="1737511740655" TEXT="akzeptiere AltModel + Wert &#x27f6; neuen Fall f&#xfc;r &#xab;Wert&#xbb; zum AltModel hinzuf&#xfc;gen"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1737048133742" ID="ID_1028852897" MODIFIED="1737125839979" TEXT="Einbindung in die DSL-Notation (class Syntax)">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1737048133742" ID="ID_1028852897" MODIFIED="1737511601637" TEXT="Einbindung in die DSL-Notation (class Syntax)">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -55882,9 +55892,42 @@
</node>
<node CREATED="1737169424955" ID="ID_5139254" MODIFIED="1737169443329" TEXT="das ist hier angemessen; es handelt sich um ein Implementierungsdetail">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737169797084" ID="ID_1565968263" MODIFIED="1737169855695" TEXT="Check auf Selektor bei AltModel notwendig">
<node COLOR="#5b280f" CREATED="1737169797084" ID="ID_1565968263" MODIFIED="1737512121424" TEXT="Check auf Selektor bei AltModel notwendig">
<linktarget COLOR="#b52e62" DESTINATION="ID_1565968263" ENDARROW="Default" ENDINCLINATION="-20;-92;" ID="Arrow_ID_43564391" SOURCE="ID_1120580246" STARTARROW="None" STARTINCLINATION="74;-2;"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="button_cancel"/>
</node>
<node COLOR="#338800" CREATED="1737512123490" ID="ID_1402725802" MODIFIED="1737512293076" TEXT="andere L&#xf6;sung: wir geben den aufzunehmenden Typ im Konstruktor vor">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Das ist eine mehrstufige Kette
</p>
<ul>
<li>
aus der Aufrufstruktur ergibt sich die ID des Branches
</li>
<li>
gleichzeitig ergibt sich damit die Position des Typ-Arguments
</li>
<li>
dieses greifen wir uns per Typ-Sequenz-Manipulation
</li>
<li>
und verwenden es im generierten Konstruktor
</li>
</ul>
<p>
&#10233; Resultat: man kann in den jeweiligen &#171;Slot&#187; nur mit einem kompatiblen Typ rein, und Typsicherheit ist gew&#228;hrleistet (im Parser; wenn ein Client falsch zugreift, ist er selber schuld)
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#36a9cb" DESTINATION="ID_767723954" ENDARROW="Default" ENDINCLINATION="1044;0;" ID="Arrow_ID_234371683" STARTARROW="None" STARTINCLINATION="257;10;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -55930,8 +55973,20 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737234396680" ID="ID_679636766" MODIFIED="1737235494542" TEXT="Alternativ-Kombinator bauen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1737511832794" ID="ID_209338146" MODIFIED="1737511947153" TEXT="Steuerung der Model-Komposition l&#xf6;sen">
<arrowlink COLOR="#579bd2" DESTINATION="ID_226754618" ENDARROW="Default" ENDINCLINATION="6;427;" ID="Arrow_ID_220186183" STARTARROW="None" STARTINCLINATION="1852;-83;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1737511902291" HGAP="21" ID="ID_1061539705" MODIFIED="1737512327118" TEXT="die F&#xe4;lle werden &#xfc;bersetzt in Template-Spezialisierungen" VSHIFT="19"/>
<node COLOR="#435e98" CREATED="1737511916591" ID="ID_1159668962" MODIFIED="1737511950227" TEXT="zus&#xe4;tzliches Marker-Template um verschachtelte Sub-Ausdr&#xfc;cke auszuklammern"/>
<node COLOR="#438798" CREATED="1737512313284" HGAP="21" ID="ID_1608529418" LINK="#ID_1402725802" MODIFIED="1737512347700" TEXT="(partielle) Typsicherheit auch beim Variant-Model">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737512357123" ID="ID_1348106042" MODIFIED="1737512388092" TEXT="Aber: im Model-Binding mu&#xdf; man die Selektoren korrekt verwenden"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737512373305" ID="ID_554578847" MODIFIED="1737512386247" TEXT="man k&#xf6;nnte hier grunds&#xe4;tzlich auch &#xbb;wild&#xab; zugreifen">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1737234396680" ID="ID_679636766" MODIFIED="1737511439516" TEXT="Alternativ-Kombinator bauen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1737235517170" ID="ID_1134480788" MODIFIED="1737430437282" TEXT="mu&#xdf; hier zuerst die Model-Mechanik entwickeln">
<icon BUILTIN="button_ok"/>
<node CREATED="1737235560972" ID="ID_968357989" MODIFIED="1737235564743" TEXT="Datenstruktur">
@ -55958,7 +56013,7 @@
<node CREATED="1737237881741" ID="ID_183722240" MODIFIED="1737237886889" TEXT="analog wie get&lt;i&gt;(tuple)"/>
<node CREATED="1737237896668" ID="ID_286879176" MODIFIED="1737237910693" TEXT="Metafunktion i &#x27fc; Typ"/>
</node>
<node CREATED="1737238022259" ID="ID_508598643" MODIFIED="1737238026071" TEXT="up-Copy">
<node CREATED="1737238022259" FOLDED="true" ID="ID_508598643" MODIFIED="1737509649097" TEXT="up-Copy">
<node CREATED="1737238037257" ID="ID_1788967087" MODIFIED="1737238050739" TEXT="gegeben: AltModel&lt;N&gt;"/>
<node CREATED="1737238051966" ID="ID_384770143" MODIFIED="1737238076015" TEXT="zu bauen: AltModel&lt;N+1&gt; mit kopierten Daten und gleichem Selektor"/>
<node COLOR="#5b280f" CREATED="1737238094329" FOLDED="true" ID="ID_1160578555" MODIFIED="1737417012015" TEXT="braucht Trampolin f&#xfc;r konkrete Kopie">
@ -56056,7 +56111,7 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1737245801576" ID="ID_1738176168" MODIFIED="1737416989050" TEXT="Skizze Datentyp">
<node COLOR="#338800" CREATED="1737245801576" FOLDED="true" ID="ID_1738176168" MODIFIED="1737509642850" TEXT="Skizze Datentyp">
<linktarget COLOR="#3dad9b" DESTINATION="ID_1738176168" ENDARROW="Default" ENDINCLINATION="-15;-187;" ID="Arrow_ID_387275034" SOURCE="ID_724398426" STARTARROW="None" STARTINCLINATION="-287;14;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1737308328478" ID="ID_993665414" MODIFIED="1737358352116" TEXT="erst mal einen uninitialised byte-Puffer in Basisklasse"/>
@ -56416,7 +56471,7 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1737417020140" ID="ID_1230396959" MODIFIED="1737430419638" TEXT="sehr komplex &#x27f9; in Hilfskomponente auslagern">
<node COLOR="#338800" CREATED="1737417020140" FOLDED="true" ID="ID_1230396959" MODIFIED="1737511446086" TEXT="sehr komplex &#x27f9; in Hilfskomponente auslagern">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737417038777" HGAP="28" ID="ID_158901588" MODIFIED="1737430931534" TEXT="lib/branch-case.hpp" VSHIFT="-10">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
@ -56468,17 +56523,18 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1737417060920" ID="ID_644848240" MODIFIED="1737417078580" TEXT="auf dieser Basis das AltModel definieren">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1737417060920" ID="ID_644848240" MODIFIED="1737511437314" TEXT="auf dieser Basis das AltModel definieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1737417079594" ID="ID_883955221" MODIFIED="1737417091878" TEXT="erst mal die Einzelschritte durchspielen">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1737417093057" ID="ID_1036480281" MODIFIED="1737417121178" TEXT="Typ konstruieren"/>
<node COLOR="#435e98" CREATED="1737417099856" ID="ID_820603798" MODIFIED="1737417121178" TEXT="einen Branch belegen"/>
<node COLOR="#435e98" CREATED="1737417104216" ID="ID_188551502" MODIFIED="1737417121178" TEXT="danach noch ein up-Copy"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737417129349" ID="ID_1317057698" MODIFIED="1737417137972" TEXT="Struktur f&#xfc;r den Kombinator darstellen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1737482932204" ID="ID_543248475" MODIFIED="1737482959189" TEXT="Aufgabe: Branch-Models generieren">
<node COLOR="#338800" CREATED="1737417129349" ID="ID_1317057698" MODIFIED="1737512033655" TEXT="Struktur f&#xfc;r den Kombinator darstellen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1737482932204" ID="ID_543248475" MODIFIED="1737509621118" TEXT="Aufgabe: Branch-Models generieren">
<icon BUILTIN="button_ok"/>
<node CREATED="1737482977331" ID="ID_63052973" MODIFIED="1737483103594" TEXT="Analog zum SeqModel, aber...">
<richcontent TYPE="NOTE"><html>
<head>
@ -56612,9 +56668,14 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737512076361" ID="ID_767723954" MODIFIED="1737512285755" TEXT="&#x27f9; Vorteil: durch den vorgegebenen Typ ist korrekte Selektor-Zuordnung sichergestellt">
<linktarget COLOR="#36a9cb" DESTINATION="ID_767723954" ENDARROW="Default" ENDINCLINATION="1044;0;" ID="Arrow_ID_234371683" SOURCE="ID_1402725802" STARTARROW="None" STARTINCLINATION="257;10;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1737503596247" ID="ID_371220796" MODIFIED="1737503608693" TEXT="Auswertung und Model-Erzeugung">
</node>
<node COLOR="#338800" CREATED="1737503596247" ID="ID_371220796" MODIFIED="1737509623137" TEXT="Auswertung und Model-Erzeugung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1737503609673" ID="ID_984166098" MODIFIED="1737507882083" TEXT="wieder zun&#xe4;chst freistehend im Test ausformulieren">
<icon BUILTIN="button_ok"/>
</node>
@ -56642,7 +56703,7 @@
</node>
<node CREATED="1737504240388" ID="ID_718576565" MODIFIED="1737504257555" TEXT="...wenn zuf&#xe4;llig beide Zweige im Kombinator den gleichen Ergebnistyp haben"/>
<node CREATED="1737504264413" ID="ID_198801973" MODIFIED="1737504277138" TEXT="mu&#xdf; anderweitig einen klaren Marker mitgeben"/>
<node CREATED="1737504278222" ID="ID_7748352" MODIFIED="1737504291496" TEXT="&#x27f9; Builder-Funktionen bieten">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737504278222" ID="ID_7748352" MODIFIED="1737509673007" TEXT="&#x27f9; Builder-Funktionen bieten">
<node CREATED="1737507477423" ID="ID_712733860" MODIFIED="1737507490145" TEXT="ist ma&#xdf;geschneidert f&#xfc;r diesen einen Fall"/>
<node CREATED="1737507491637" ID="ID_397795294" MODIFIED="1737507505855" TEXT="Clients sollen nur selected() und get&lt;i&gt;() verwenden"/>
<node CREATED="1737507511586" ID="ID_1197062880" MODIFIED="1737507548997" TEXT="eigentlichen Konstruktor besser private machen">
@ -56663,8 +56724,14 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737417144217" ID="ID_375516701" MODIFIED="1737417153090" TEXT="in einen Connex-Builder verpacken">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1737417144217" ID="ID_375516701" MODIFIED="1737509801908" TEXT="in einen Connex-Builder verpacken">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1737509678203" ID="ID_1999420291" MODIFIED="1737509807141" TEXT="Schema komplett analog zum Seq-Kombinator"/>
<node COLOR="#435e98" CREATED="1737509718739" ID="ID_1116046294" MODIFIED="1737509807141" TEXT="Name: branchedConnex"/>
</node>
<node COLOR="#338800" CREATED="1737509793049" ID="ID_1918405073" MODIFIED="1737509829765" TEXT="funktioniert im Test">
<arrowlink COLOR="#69a19e" DESTINATION="ID_508161235" ENDARROW="Default" ENDINCLINATION="262;-17;" ID="Arrow_ID_1424243307" STARTARROW="None" STARTINCLINATION="-269;35;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -56691,8 +56758,14 @@
<node COLOR="#435e98" CREATED="1737234345007" ID="ID_710053406" MODIFIED="1737234350021" TEXT="Syntax erweitern"/>
<node COLOR="#435e98" CREATED="1737234354774" ID="ID_118574311" MODIFIED="1737234357941" TEXT="Whitespace"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737234372227" ID="ID_943372204" MODIFIED="1737234378059" TEXT="Alternativ-Kombinator">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1737234372227" ID="ID_943372204" MODIFIED="1737512401123" TEXT="Alternativ-Kombinator">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1737509744717" ID="ID_212415977" MODIFIED="1737509760563" TEXT="Eigenschaften des Model-Datentyps ausleuchten"/>
<node COLOR="#435e98" CREATED="1737509761718" ID="ID_1413438588" MODIFIED="1737509773573" TEXT="Grundmechnismus analog aufbauen"/>
<node COLOR="#435e98" CREATED="1737509774878" ID="ID_508161235" MODIFIED="1737509834649" TEXT="Kombinator per DSL">
<linktarget COLOR="#69a19e" DESTINATION="ID_508161235" ENDARROW="Default" ENDINCLINATION="262;-17;" ID="Arrow_ID_1424243307" SOURCE="ID_1918405073" STARTARROW="None" STARTINCLINATION="-269;35;"/>
</node>
<node COLOR="#435e98" CREATED="1737512403229" ID="ID_1723790713" MODIFIED="1737512410412" TEXT="Syntax erweitern"/>
</node>
</node>
</node>