Library: demonstrate »the« textbook example

...evaluating the recursive syntax of a numerical expression!
 * so this light-weight parsing support framework indeed allows
   to build fully capable LL(x) parsers, when the user knows how
   handle syntax clauses and bind the result models
 * furthermore, a notation is demonstrated how to arrange the
   binding functions so to keep the syntax definition legible
 * this involves a shortcut for homogeneous alternatives
This commit is contained in:
Fischlurch 2025-01-28 20:23:28 +01:00
parent ed5c6f7c17
commit f8d0c1cf0b
4 changed files with 208 additions and 109 deletions

View file

@ -263,6 +263,15 @@ namespace lib {
{
return access<SlotType<idx>>();
}
/** access the selected value of a homogeneous model.
* @warning compiles only if all cases yield the same type
*/
auto
getAny()
{
return accept([](auto val){ return val; });
}
};
}// namespace lib

View file

@ -296,7 +296,7 @@ namespace util {
template<typename...XS, typename XX>
SeqModel (SeqModel<XS...>&& seq, XX&& extraElm)
: Tup{std::tuple_cat (seq.extractTuple()
,make_tuple (forward<XX> (extraElm)) )}
,std::make_tuple (forward<XX> (extraElm)) )}
{ }
template<typename X1, typename X2>

View file

@ -105,7 +105,7 @@ namespace test {
string toParse{"hello vile world of power"};
auto eval = parse (toParse);
CHECK (eval.result);
auto res = *eval.result; // ◁——————————— the »result model« of a terminal parse is the RegExp-Matcher
smatch res = *eval.result; // ◁——————————— the »result model« of a terminal parse is the RegExp-Matcher
CHECK (res.ready() and not res.empty());
CHECK (res.size() == "2"_expect );
CHECK (res.position() == "0"_expect );
@ -271,6 +271,17 @@ namespace test {
CHECK (res.get<1>() == "seduced");
// AltModel with homogeneous types are special
auto hom = AltModel<int,int>::mark_right(42);
CHECK (hom.getAny() == 42);
CHECK (hom.selected() == 1 );
hom = AltModel<int,int>::mark_left(55);
CHECK (hom.getAny() == 55);
CHECK (hom.selected() == 0 );
//_____________________________________________
// Demonstration: how branch combinator works....
auto term1 = buildConnex ("brazen");
@ -619,7 +630,16 @@ namespace test {
}
/** @test definition of recursive Syntax clauses
* - pre-declared placeholder with known result
* - bind a syntax clause later to that placeholder,
* which is possibly only with a binding to yield
* the expected result type; in the example here
* we count the optional sequenced expressions
* - demonstrate textbook example of nested numeric
* expression, including parentheses and even a
* square root function. Calculate golden ratio!
*/
void
verify_recursiveSyntax()
@ -637,14 +657,56 @@ namespace test {
});
CHECK (recurse.canInvoke());
string s1{"great ! great ! great"};
recurse.parse(s1);
recurse.parse("great ! great ! great");
CHECK (recurse.success());
CHECK (recurse.getResult() == 3 );
CHECK (not recurse.parse(" ! great"));
CHECK (not recurse.parse(" ! great"));
CHECK (recurse.parse("great ! great actor").getResult() == 2);
CHECK (recurse.parse("great ! great ! actor").getResult() == 2);
//_____________________________________________
// Build a recursive numeric expression syntax...
auto num = accept("\\d+") .bindMatch().bind([](auto num){ return std::stod(num); });
auto sqrt = accept("").seq(num) .bind([](auto seq){ return std::sqrt(get<1>(seq)); });
CHECK (sqrt.parse(" √x ").getResult() == 0 );
CHECK (sqrt.parse(" √2 ").getResult() == "1.4142136"_expect);
// E ::= T [ + E ]
// T ::= F [ / F ]
// F ::= ( E ) | V
// V ::= num | √ num
auto expr = expectResult<double>();
auto valu = accept(num).alt(sqrt) .bind([](auto alt){ return alt.getAny(); });
auto fact = accept_bracket(expr).alt(valu) .bind([](auto alt){ return alt.getAny(); });
auto term = accept(fact).opt(accept("/") .seq(fact)) .bind([](auto seq){ auto [f1,f2] = seq; return f1 / (f2? get<1>(*f2) : 1.0); });
expr = accept(term).opt(accept("\\+").seq(expr)) .bind([](auto exp){ auto [s1,s2] = exp; return s1 + (s2? get<1>(*s2) : 0.0); });
CHECK (expr.canInvoke());
CHECK (not expr.hasResult());
expr.parse(" 42 forever");
CHECK (expr.success());
CHECK (expr.getResult() == 42 );
expr.parse(" 42 + 13 =?");
CHECK (expr.success());
CHECK (expr.getResult() == 55 );
expr.parse(" 1 + 4/3 ");
CHECK (expr.success());
CHECK (expr.getResult() == "2.3333333"_expect);
expr.parse("(2+2)/(2+1) + 4/2");
CHECK (expr.success());
CHECK (expr.getResult() == "3.3333333"_expect);
expr.parse("(1 + √5) / 2 ");
CHECK (expr.success());
CHECK (expr.getResult() == "1.618034"_expect);
}
};

View file

@ -57029,8 +57029,7 @@
nebenbei abgefallen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1737763004632" ID="ID_822193320" MODIFIED="1737763015437" TEXT="ist nur ein Dekorator der Parse-Funktion"/>
@ -57045,8 +57044,7 @@
<i>das</i>&#160;mu&#223; tats&#228;chlich ein <b>Postfix-Operator</b>&#160;sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node COLOR="#435e98" CREATED="1737763069414" ID="ID_1049523751" MODIFIED="1737849866205">
@ -57057,8 +57055,7 @@
Vorschlag: <font face="Monospaced"><b>bind</b>(</font><font face="Monospaced" color="#642929">FUN</font><font face="Monospaced">)</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737763165990" FOLDED="true" ID="ID_1051966220" MODIFIED="1737940855527" TEXT="wichtig: static-assertion bieten">
<richcontent TYPE="NOTE"><html>
@ -57068,8 +57065,7 @@
damit klar gesagt wird, wenn die Funktion nicht den bisherigen Result-Typ nimmt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node COLOR="#2d40b2" CREATED="1737766232691" ID="ID_1413683857" MODIFIED="1737775474932" TEXT="Ha! die ist schon da">
<icon BUILTIN="ksmiletris"/>
<icon BUILTIN="button_cancel"/>
@ -57103,8 +57099,7 @@
Standard-Variante: <font face="Monospaced"><b>bindMatch</b>(n)</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1737817661406" ID="ID_74788283" MODIFIED="1737817685150" TEXT="auf Matcher &#x27fc; match-group"/>
<node COLOR="#5c4398" CREATED="1737817685762" ID="ID_522207502" MODIFIED="1737940782764" TEXT="eine Verallgemeinerung versuchen">
<node CREATED="1737818008232" ID="ID_1008681073" MODIFIED="1737818043982" TEXT="mu&#xdf; daf&#xfc;r constexpr-branch mit switch-on-Type machen"/>
@ -57116,8 +57111,7 @@
...denn es steuert die Art der Dekoration
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="closed"/>
<node CREATED="1737818825722" ID="ID_1135482924" MODIFIED="1737818869980" TEXT="geht nicht">
<icon BUILTIN="stop-sign"/>
@ -57140,8 +57134,7 @@
analog wie die anderen Combinatoren und buildConnex()
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1737820217112" ID="ID_983053078" MODIFIED="1737820261322" TEXT="da kommt dann die constexpr-if-Kaskade rein">
<icon BUILTIN="button_ok"/>
@ -57155,8 +57148,7 @@
nachdem ich die Model-F&#228;lle wegdiskutiert habe &#9786;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737844971662" ID="ID_48221377" MODIFIED="1737844986417" TEXT="die constexpr-if kann nach innen!">
<icon BUILTIN="idea"/>
@ -57191,8 +57183,7 @@
es br&#228;uchte f&#252;r alle erdenklichen F&#228;lle einen Pfad, um auf einen String zu kommen; also br&#228;uchte es sowas wie einen operator string(), oder man m&#252;&#223;te rekursiv in alle Teilkomponenten hinein mappen; und was dann mit Komponenten, die bereits explizit transformiert wurden, wie erkennt man die, und was macht man mit denen??
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#5b280f" CREATED="1737844404123" ID="ID_1490711015" MODIFIED="1737844630457" TEXT="Nutzen zweifelhaft">
<richcontent TYPE="NOTE"><html>
@ -57205,8 +57196,7 @@
F&#252;r eine reale Anwendung sollte man m&#246;glichst tief unten mappen, und b&#228;uchte auch ein Konzept, um auf einen gemeinsamen Ergebnis-Typ zu kommen, m&#246;glicherweise dann doch so etwas wie einen AST. <i>Und wenn man es dann doch wirklich br&#228;uchte, kann man's immer noch nachr&#252;sten</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
@ -57235,8 +57225,7 @@
Die C++ &#187;structured bindings&#171; funktionieren f&#252;r Arrays, f&#252;r <i>tuple-like</i>&#160; und aber auch f&#252;r einfache PODs. Wenn std::tuple_size ein <i>incomplete-type</i>&#160; ist, dann versucht der Compiler ein Binding auf Struct-Felder, scheitert aber daran, da&#223; es eine nicht-triviale Basis-Klasse gibt (und damit die Feld-Nummer nicht mehr offensichtlich klar ist)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1737849793598" ID="ID_213117529" MODIFIED="1737849811165" TEXT="also die beiden notwendigen Spezialisierungen in den namespace std;">
@ -57261,8 +57250,7 @@
ganz banal: habe <font face="Monospaced">eval.consumed</font>&#160;nicht weitergegeben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57270,8 +57258,7 @@
d.h. jede sub-expression setzt wieder am Anfang auf
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node COLOR="#338800" CREATED="1737850519594" ID="ID_1668182663" MODIFIED="1737850539048" TEXT="auch mit &#x3bb;-generic binden">
@ -57282,8 +57269,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737515362910" ID="ID_1587990202" MODIFIED="1737850611368" TEXT="offene Rekursion">
<icon BUILTIN="flag-pink"/>
<node COLOR="#338800" CREATED="1737515362910" ID="ID_1587990202" MODIFIED="1738091484405" TEXT="offene Rekursion">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#d9bf94" COLOR="#690f14" CREATED="1737515599278" ID="ID_1897353084" MODIFIED="1737940885393" STYLE="fork" TEXT="schwierige Frage....">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="help"/>
@ -57293,11 +57280,17 @@
<node CREATED="1737515630666" ID="ID_635140645" MODIFIED="1737940878718" TEXT="es ist notwendig f&#xfc;r Dinge wie verschachtelte Ausdr&#xfc;cke">
<linktarget COLOR="#ff3f2d" DESTINATION="ID_635140645" ENDARROW="Default" ENDINCLINATION="-304;-13;" ID="Arrow_ID_727534380" SOURCE="ID_902364621" STARTARROW="None" STARTINCLINATION="-466;22;"/>
</node>
<node CREATED="1737515930491" ID="ID_72368755" MODIFIED="1737940896885" TEXT="nicht als Inline-Model darstellbar">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737515930491" ID="ID_72368755" MODIFIED="1738091430998" TEXT="nicht als Inline-Model darstellbar">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1737515978965" ID="ID_1241101297" MODIFIED="1737515987234" TEXT="m&#xfc;&#xdf;te dann ein smart-Ptr sein"/>
<node CREATED="1737516017110" ID="ID_1717046822" MODIFIED="1737516058676" TEXT="m&#xfc;&#xdf;te undefiniert in der DSL referenzierbar sein"/>
<node CREATED="1737553446367" ID="ID_420976669" MODIFIED="1737553464114" TEXT="m&#xfc;&#xdf;te daf&#xfc;r Klauseln per Referenz nehmen k&#xf6;nnen"/>
<node COLOR="#5b280f" CREATED="1737515978965" ID="ID_1241101297" MODIFIED="1738091424815" TEXT="m&#xfc;&#xdf;te dann ein smart-Ptr sein">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737516017110" ID="ID_1717046822" MODIFIED="1738091422615" TEXT="m&#xfc;&#xdf;te undefiniert in der DSL referenzierbar sein">
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737553446367" ID="ID_420976669" MODIFIED="1738091407004" TEXT="m&#xfc;&#xdf;te daf&#xfc;r Klauseln per Referenz nehmen k&#xf6;nnen">
<icon BUILTIN="forward"/>
</node>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737940901148" ID="ID_28139865" MODIFIED="1737940937388" TEXT="Fazit: finde L&#xf6;sung die dennoch nicht das Framework sprengt">
<arrowlink COLOR="#6e3b4f" DESTINATION="ID_1616305471" ENDARROW="Default" ENDINCLINATION="-8;-18;" ID="Arrow_ID_129215188" STARTARROW="None" STARTINCLINATION="-11;31;"/>
@ -57305,7 +57298,7 @@
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1737693819337" ID="ID_228574257" MODIFIED="1737940638024" TEXT="Implementierungs-Technik kl&#xe4;ren">
<node COLOR="#338800" CREATED="1737693819337" FOLDED="true" ID="ID_228574257" MODIFIED="1737940638024" TEXT="Implementierungs-Technik kl&#xe4;ren">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737693835207" ID="ID_1616305471" MODIFIED="1737940937388" TEXT="grunds&#xe4;tzlich realisierbar in diesem Framework">
<linktarget COLOR="#6e3b4f" DESTINATION="ID_1616305471" ENDARROW="Default" ENDINCLINATION="-8;-18;" ID="Arrow_ID_129215188" SOURCE="ID_28139865" STARTARROW="None" STARTINCLINATION="-11;31;"/>
@ -57318,21 +57311,17 @@
....weil eine rekursive Definition im Prinzip offen ist und im Extremfall auch tats&#228;chlich nicht terminiert; in Haskell k&#246;nnte man einen solchen Typ anschreiben, in C++ nicht (weil Typ-Ausdr&#252;cke eager aufgel&#246;st werden)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737693890688" ID="ID_70642689" MODIFIED="1737694064532" TEXT="das Ergebnis ist trotzdem strikt typisiert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn was wir abschneiden ist nur die komplett ausformulierte Struktur des Typs; an der Stelle, an der eine andere Klausel rekursiv eingebunden wird, greifen wir nur <i>deren Ergebnis-Model</i>&#160;auf.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#d9bf94" COLOR="#690f14" CREATED="1737694065800" ID="ID_303092277" MODIFIED="1737940681608" TEXT="das stellt aber ein Lock-in dar">
<icon BUILTIN="messagebox_warning"/>
@ -57341,41 +57330,35 @@
<icon BUILTIN="help"/>
<node CREATED="1737694494314" ID="ID_1349021262" MODIFIED="1737694529548" TEXT="konkrete Typen k&#xf6;nnen nur durch &#xbb;Beispiel&#xab; erzeugt werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
der Lambdas wegen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737694541439" ID="ID_1004008024" MODIFIED="1737694566958">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
das hei&#223;t, es w&#252;rde eine Art <i>late-Binding</i>&#160;notwendig
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#d9bf94" COLOR="#690f14" CREATED="1737694569853" ID="ID_1483280295" MODIFIED="1737940688571" TEXT="und zwar auf Typ-Ebene">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737761108914" ID="ID_64242861" MODIFIED="1737761160846" TEXT="oder der Typ an der Schnitt-Stelle mu&#xdf; vereinfacht werden">
<arrowlink COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="22;-101;" ID="Arrow_ID_1260672332" STARTARROW="None" STARTINCLINATION="-525;26;"/>
<arrowlink COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="69;-109;" ID="Arrow_ID_1260672332" STARTARROW="None" STARTINCLINATION="-525;26;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1737738318817" FOLDED="true" ID="ID_1107737972" MODIFIED="1737940652324" TEXT="nochmal Vergleich mit existierenden Libraries">
<node COLOR="#435e98" CREATED="1737738318817" FOLDED="true" ID="ID_1107737972" MODIFIED="1737940652324" TEXT="nochmal Vergleich mit existierenden Libraries">
<icon BUILTIN="list"/>
<node CREATED="1737738393985" ID="ID_1121877326" MODIFIED="1737751317964" TEXT="viele verstecken das Thema (wenn es &#xfc;berhaupt erw&#xe4;hnt wird)">
<icon BUILTIN="messagebox_warning"/>
@ -57401,34 +57384,28 @@
</node>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737756303660" ID="ID_593591679" MODIFIED="1737940658714" TEXT="Unvermeidbare Einschr&#xe4;nkung: User mu&#xdf; Result-Type explizit benennen">
<linktarget COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="22;-101;" ID="Arrow_ID_1260672332" SOURCE="ID_64242861" STARTARROW="None" STARTINCLINATION="-525;26;"/>
<linktarget COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="69;-109;" ID="Arrow_ID_1260672332" SOURCE="ID_64242861" STARTARROW="None" STARTINCLINATION="-525;26;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<node CREATED="1737756333584" ID="ID_473974893" MODIFIED="1737756354874" TEXT="damit k&#xf6;nnen wir eine std::function&lt;Ret(StrView)&gt; anlegen"/>
<node CREATED="1737756891099" ID="ID_1058310023" MODIFIED="1737756901161">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
und sp&#228;ter an diese <b>zuweisen</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737756949618" ID="ID_1994498294" MODIFIED="1737757016770">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
das impliziert <b>Heap-Storage</b>&#160;f&#252;r das Parse-&#955;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1737757056699" ID="ID_1321549013" MODIFIED="1737757108138" TEXT="und i.d.R. schlechte Optimierbarkeit">
@ -57440,16 +57417,13 @@
</node>
<node BACKGROUND_COLOR="#e8d8bb" CREATED="1737757274593" ID="ID_1290815698" MODIFIED="1737850572394" TEXT="User mu&#xdf; typischerweise ein Result-Binding definieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn sonst d&#252;rfte es kaum m&#246;glich sein, einen explizit angebbaren Result-Typ zu konstituieren; in diesem Result-Binding steckt der <i>eigentliche Ansatz,</i>&#160;mit dem eine offen-rekursive Grammatik dennoch handhabbar wird, denn es mu&#223; eine Art Reduktion der Komplexit&#228;t erfolgen, beispielsweise indem sofort ein Ergebnis ausgerechnet wird
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<arrowlink COLOR="#d2fad9" DESTINATION="ID_311219420" ENDARROW="Default" ENDINCLINATION="-362;51;" ID="Arrow_ID_1251442496" STARTARROW="None" STARTINCLINATION="-954;49;"/>
<icon BUILTIN="forward"/>
<node COLOR="#753c48" CREATED="1737762884132" HGAP="23" ID="ID_1097242773" MODIFIED="1737940733425" TEXT="&#x27f9; das mu&#xdf; das n&#xe4;chste Thema sein" VSHIFT="10">
@ -57490,27 +57464,21 @@
<node CREATED="1737758383978" ID="ID_70770798" MODIFIED="1737758456356" TEXT="da jede weitere Dekoration dem Sinn der Forward-Deklaration zuwiderl&#xe4;uft"/>
<node CREATED="1737758466942" ID="ID_397213831" MODIFIED="1737758745475">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Konsequenz &#10233; das <i>Einbinden</i>&#160;in andere Syntax ist speziell zu behandeln
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
....weil ja das Einbinden technisch nichts anderes ist, als eine Dekoration (und damit unterbunden w&#252;rde)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737758560698" ID="ID_1679326652" MODIFIED="1737758575731" TEXT="man mu&#xdf; eine solche Syntax noch zuweisen und dann so verwenden wie sie ist"/>
<node CREATED="1737758982616" ID="ID_375516011" MODIFIED="1737759057960" TEXT="(oder aber in andere Syntax integrieren &#x2014; was stets m&#xf6;glich ist)">
@ -57521,8 +57489,7 @@
diese andere Syntax h&#228;tte dann aber auch einen anderen Typ und m&#252;&#223;te in einer anderen Syntax-Variablen gespeichert werden;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
@ -57543,8 +57510,7 @@
Variante-1 ist &#187;filosofisch&#171; und praktsich attraktiv
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57552,8 +57518,7 @@
...weil sie der &#8222;dann mach's halt nicht falsch&#8220;-Haltung entspricht, die diesem ganzen Parser-Framework zugrunde gelegt wurde; und ganz praktisch: man bekommt diese Variante geschenkt, alles funktioniert von selber so wie es soll &#8212; und wenn irgendjemand unbedingt dekorieren m&#246;chte, dann soll er halt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737760037922" ID="ID_188274481" MODIFIED="1737760311471" TEXT="Variante-3 w&#xfc;rde tats&#xe4;chlich erweiterte Logik erm&#xf6;glichen &#x2014; erscheint aber fragw&#xfc;rdig">
<richcontent TYPE="NOTE"><html>
@ -57563,8 +57528,7 @@
Weil das, was man nun zus&#228;tzlich machen k&#246;nnte, nur auf Basis der Implementierung verst&#228;ndlich ist, aber f&#252;r jeden Benutzer ziemlich verwirrend
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node COLOR="#3e12bf" CREATED="1737760312861" ID="ID_1430169629" MODIFIED="1737940605425" TEXT="Beschlu&#xdf;: Variante-1">
@ -57579,8 +57543,7 @@
da sie ohnehin das erlaubt was man machen sollte, aber Fehl-Verwendungen unterbindet
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737760356767" ID="ID_523967840" MODIFIED="1737760483530" TEXT="ist aber in der Umsetzung unklar">
<richcontent TYPE="NOTE"><html>
@ -57590,8 +57553,7 @@
da man ja dennoch irgendwie auf diese Funktion Bezug nehmen kann, indem man sie in andere Sytnax einbaut, ist die Abgrenzung zum <i>&#187;Dekorieren&#171;</i>&#160; nicht klar
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737760484654" ID="ID_1431261175" MODIFIED="1737760552303" TEXT="besser ist, korrekte und klare Verwendung der Library zu fordern"/>
</node>
@ -57608,8 +57570,7 @@
...sie best&#252;nde darin, die Referenzen nach der Zuweisung zu <i>materialisieren;</i>&#160; aber die Schwierigkeit besteht darin dieses Linken auszul&#246;sen, da die ganze DSL darauf abstellt, Funktionen beliebig ineinander zu verschachteln, und damit sehr viel zu kopieren; man m&#252;&#223;te dann entweder eine komplette Link-Infrastruktur hochziehen (Parser-Funktionen w&#228;ren speziell als noch ungelinkt markiert und es g&#228;be einen separaten Call-Chain), oder man m&#252;&#223;t das Binden/Materialisieren beim ersten Aufruf machen, was in der Praxis nicht sonderlich hilfreich ist
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737761029853" ID="ID_588199339" MODIFIED="1737761044357" TEXT="also auch das etwas, was man einfach akzeptieren sollte">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
@ -57688,8 +57649,7 @@
da viele Builder-Funktionen in ein neues Syntax-Objekt schieben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
@ -57708,14 +57668,16 @@
<icon BUILTIN="messagebox_warning"/>
</node>
<node COLOR="#435e98" CREATED="1737927762571" ID="ID_980466550" MODIFIED="1737940529468" TEXT="spezieller dedurction-Guide f&#xfc;r Parser">
<node CREATED="1737927795006" ID="ID_1992583888" MODIFIED="1737927819175" TEXT="der macht den Schwenk auf die eingebettete Referenz"/>
<node COLOR="#435e98" CREATED="1737927795006" ID="ID_1992583888" MODIFIED="1738091472008" TEXT="der macht den Schwenk auf die eingebettete Referenz">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1737927820003" ID="ID_303011411" MODIFIED="1737940558181" TEXT="zur Vereinfachung: Type-Alias definieren">
<icon BUILTIN="yes"/>
<node CREATED="1737927831639" ID="ID_349690499" MODIFIED="1737927838908" TEXT="OpaqueConnex&lt;RES&gt;"/>
<node CREATED="1737927839640" ID="ID_320293715" MODIFIED="1737927849187" TEXT="ForwardConnex&lt;RES&gt;"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1737927867197" ID="ID_1443350587" MODIFIED="1737940527967" TEXT="ma&#xdf;geschneiderte buildConnex(Syntax&lt;OpaqueConnex&gt;)">
<node COLOR="#435e98" CREATED="1737927867197" FOLDED="true" ID="ID_1443350587" MODIFIED="1738091456117" TEXT="ma&#xdf;geschneiderte buildConnex(Syntax&lt;OpaqueConnex&gt;)">
<node CREATED="1737927895529" ID="ID_1795977503" MODIFIED="1737927907403" TEXT="erzwingt explizit die Konversion"/>
<node CREATED="1737927908178" ID="ID_614403358" MODIFIED="1737927930153" TEXT="konstruiert direkt einen ForwardConnex"/>
<node CREATED="1737927930852" ID="ID_956432509" MODIFIED="1737927946326" TEXT="brauche daf&#xfc;r geeigneten Ctor, um die Referenz zu akzeptieren"/>
@ -57753,8 +57715,7 @@
ausdefinierte Syntax <i>per Value</i>&#160;(!) nehmen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1737932057241" ID="ID_201731446" MODIFIED="1737932069138" TEXT="explizit die custom-conversion triggern"/>
<node CREATED="1737932070061" ID="ID_193505924" MODIFIED="1737932078546" TEXT="dann die Parse-Funktion r&#xfc;berschieben"/>
@ -57770,8 +57731,7 @@
...es f&#228;llt mir schwer, keine Fehler-Checks zu machen, aber ein kurzer Versuch zeigt, da&#223; diese so einiges Metaprogramming erfordern w&#252;rden &#8212; und ich habe generell beschlossen, hier <b>keine Parser-Library</b>&#160;zu entwickeln, sondern <i>nur Abk&#252;rzungen f&#252;r einfache Parse-Tasks,</i>&#160; die jemand wie ich auch von Hand (per Rekursive-descent) schreiben k&#246;nnte. In dem Fall bin ich also mal arrogant und warte, was passiert, denn ich kann mir nicht vorstellen, da&#223; man dieses Framework ohne gewisse Erfahrungen mit Parsern verwenden kann...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -57787,9 +57747,78 @@
<arrowlink COLOR="#a670c5" DESTINATION="ID_476963617" ENDARROW="Default" ENDINCLINATION="63;87;" ID="Arrow_ID_1307955722" STARTARROW="None" STARTINCLINATION="391;0;"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737509793049" ID="ID_1654271031" MODIFIED="1737932316916" TEXT="erwartete Verwendung im Test durchspielen">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1737509793049" ID="ID_1654271031" MODIFIED="1738091231539" TEXT="erwartete Verwendung im Test durchspielen">
<arrowlink COLOR="#69a19e" DESTINATION="ID_1564220447" ENDARROW="Default" ENDINCLINATION="365;-30;" ID="Arrow_ID_30873436" STARTARROW="None" STARTINCLINATION="-288;17;"/>
<icon BUILTIN="flag-pink"/>
<icon BUILTIN="pencil"/>
<node CREATED="1738089850124" ID="ID_169271928" MODIFIED="1738089862210" TEXT="Beispiel: numerischer Ausdruck">
<node CREATED="1738089863497" ID="ID_988046108" MODIFIED="1738091511457" TEXT="&#xbb;der Klassiker&#xab;">
<node BACKGROUND_COLOR="#e3d8ba" CREATED="1738089891982" ID="ID_1470816547" MODIFIED="1738091534219" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced" color="#e62a01"><b>E</b></font><font face="Monospaced">&#160;::= </font><font face="Monospaced" color="#9b0338">T</font><font face="Monospaced">&#160;[ + </font><font face="Monospaced" color="#e62a01"><b>E</b></font><font face="Monospaced">&#160;] </font>
</p>
<p>
<font face="Monospaced" color="#9b0338">T</font><font face="Monospaced">&#160;::= </font><font face="Monospaced" color="#9b0338">F</font><font face="Monospaced">&#160;[ / </font><font face="Monospaced" color="#9b0338">F</font><font face="Monospaced">&#160;] </font>
</p>
<p>
<font face="Monospaced" color="#9b0338">F</font><font face="Monospaced">&#160;::= ( </font><font face="Monospaced" color="#e62a01"><b>E</b></font><font face="Monospaced">&#160;) | </font><font face="Monospaced" color="#9b0338">V</font>
</p>
<p>
<font face="Monospaced" color="#9b0338">V</font><font face="Monospaced">&#160;::= </font><font face="Monospaced" color="#172eee">num</font><font face="Monospaced">&#160;&#160;&#160;| </font><font face="Monospaced" color="#32777e">&#8730;</font><font face="Monospaced">&#160;</font><font face="Monospaced" color="#172eee">num</font>
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node CREATED="1738090083484" ID="ID_1980844178" MODIFIED="1738090093620" TEXT="binding &#x27fc; double">
<node COLOR="#435e98" CREATED="1738090106160" ID="ID_1537756860" MODIFIED="1738090162305" TEXT="bequemere Notation f&#xfc;r Alternativen">
<icon BUILTIN="idea"/>
<node CREATED="1738090117309" ID="ID_336101391" MODIFIED="1738090133812">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Spezialfall hier: <i>homogenes Model</i>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1738090134820" ID="ID_1211990966" MODIFIED="1738090144679" TEXT="daf&#xfc;r kann der Visitor einen Wert liefern"/>
<node COLOR="#435e98" CREATED="1738090145459" ID="ID_944982552" MODIFIED="1738090158609" TEXT="vordefiniert als AltModel::getAny()">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f4a" CREATED="1738090228760" ID="ID_1868530708" MODIFIED="1738090248792" TEXT="compiliert nur bei kompatiblen Typen"/>
</node>
<node COLOR="#434698" CREATED="1738090168392" ID="ID_1884619934" MODIFIED="1738090222263" TEXT="baue auch noch eine Quadratwurzel ein">
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#5a2baa" CREATED="1738090179863" ID="ID_1009402167" MODIFIED="1738091972292" TEXT="wichtig: jede Produktion mit Binding ausstatten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
....denn nur so bekommt man den Aufwand in den Griff;
</p>
<p>
ich demonstriere auch die (beabsichtigte) Anordnung im Quelltext, indem die bindings in eine Spalte rechts geschrieben werden; jede, <i>wirklich jede</i>&#160;Syntax-Klausel sollte den beabsichtigten Ergebnistyp haben (hier double), sonst l&#228;uft dieses Schema aus dem Ruder
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e4eda1" COLOR="#007199" CREATED="1738090286760" ID="ID_1538254940" MODIFIED="1738090327155" STYLE="fork" TEXT="kann &#x3a6; ausrechnen">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<font NAME="SansSerif" SIZE="13"/>
<node BACKGROUND_COLOR="#dad1a5" COLOR="#435e98" CREATED="1738091256581" ID="ID_1201454210" MODIFIED="1738091297020" TEXT="&#x263a;">
<font NAME="SansSerif" SIZE="22"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1737048820482" ID="ID_235554745" MODIFIED="1737048832524" TEXT="generisches Model-Binding"/>
@ -57855,9 +57884,8 @@
<node COLOR="#338800" CREATED="1737932197686" ID="ID_239473120" MODIFIED="1737932209253" TEXT="Rekursive Syntax">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1737932214652" ID="ID_725486933" MODIFIED="1737932224531" TEXT="die klassische selbst-rekursive Regel"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737509774878" ID="ID_1564220447" MODIFIED="1737932324341" TEXT="Beispiel f&#xfc;r verschachtelte Expressions">
<node COLOR="#435e98" CREATED="1737509774878" ID="ID_1564220447" MODIFIED="1738091240280" TEXT="Beispiel f&#xfc;r verschachtelte Expressions">
<linktarget COLOR="#69a19e" DESTINATION="ID_1564220447" ENDARROW="Default" ENDINCLINATION="365;-30;" ID="Arrow_ID_30873436" SOURCE="ID_1654271031" STARTARROW="None" STARTINCLINATION="-288;17;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node CREATED="1737845308863" ID="ID_383219766" MODIFIED="1737845313627" TEXT="simpleUsage">