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:
parent
ed5c6f7c17
commit
f8d0c1cf0b
4 changed files with 208 additions and 109 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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> muß tatsächlich ein <b>Postfix-Operator</b> 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 ⟼ 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ß dafü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älle wegdiskutiert habe ☺
|
||||
</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äuchte für alle erdenklichen Fälle einen Pfad, um auf einen String zu kommen; also bräuchte es sowas wie einen operator string(), oder man müß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ür eine reale Anwendung sollte man möglichst tief unten mappen, und bäuchte auch ein Konzept, um auf einen gemeinsamen Ergebnis-Typ zu kommen, möglicherweise dann doch so etwas wie einen AST. <i>Und wenn man es dann doch wirklich bräuchte, kann man's immer noch nachrüsten</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -57235,8 +57225,7 @@
|
|||
Die C++ »structured bindings« funktionieren für Arrays, für <i>tuple-like</i>  und aber auch für einfache PODs. Wenn std::tuple_size ein <i>incomplete-type</i>  ist, dann versucht der Compiler ein Binding auf Struct-Felder, scheitert aber daran, daß 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> 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 λ-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ür Dinge wie verschachtelte Ausdrü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üßte dann ein smart-Ptr sein"/>
|
||||
<node CREATED="1737516017110" ID="ID_1717046822" MODIFIED="1737516058676" TEXT="müßte undefiniert in der DSL referenzierbar sein"/>
|
||||
<node CREATED="1737553446367" ID="ID_420976669" MODIFIED="1737553464114" TEXT="müßte dafür Klauseln per Referenz nehmen können"/>
|
||||
<node COLOR="#5b280f" CREATED="1737515978965" ID="ID_1241101297" MODIFIED="1738091424815" TEXT="müßte dann ein smart-Ptr sein">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737516017110" ID="ID_1717046822" MODIFIED="1738091422615" TEXT="müßte undefiniert in der DSL referenzierbar sein">
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737553446367" ID="ID_420976669" MODIFIED="1738091407004" TEXT="müßte dafür Klauseln per Referenz nehmen können">
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737940901148" ID="ID_28139865" MODIFIED="1737940937388" TEXT="Fazit: finde Lö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ären">
|
||||
<node COLOR="#338800" CREATED="1737693819337" FOLDED="true" ID="ID_228574257" MODIFIED="1737940638024" TEXT="Implementierungs-Technik klären">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737693835207" ID="ID_1616305471" MODIFIED="1737940937388" TEXT="grundsä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ächlich nicht terminiert; in Haskell könnte man einen solchen Typ anschreiben, in C++ nicht (weil Typ-Ausdrücke eager aufgelö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> 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önnen nur durch »Beispiel« 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ßt, es würde eine Art <i>late-Binding</i> 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ß 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 überhaupt erwä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änkung: User muß 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önnen wir eine std::function<Ret(StrView)> anlegen"/>
|
||||
<node CREATED="1737756891099" ID="ID_1058310023" MODIFIED="1737756901161">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
und spä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> für das Parse-λ
|
||||
</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ß typischerweise ein Result-Binding definieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...denn sonst dürfte es kaum möglich sein, einen explizit angebbaren Result-Typ zu konstituieren; in diesem Result-Binding steckt der <i>eigentliche Ansatz,</i> mit dem eine offen-rekursive Grammatik dennoch handhabbar wird, denn es muß eine Art Reduktion der Komplexitä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="⟹ das muß das nä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äuft"/>
|
||||
<node CREATED="1737758466942" ID="ID_397213831" MODIFIED="1737758745475">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Konsequenz ⟹ das <i>Einbinden</i> 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ürde)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1737758560698" ID="ID_1679326652" MODIFIED="1737758575731" TEXT="man muß 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 — was stets möglich ist)">
|
||||
|
|
@ -57521,8 +57489,7 @@
|
|||
diese andere Syntax hätte dann aber auch einen anderen Typ und müß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 »filosofisch« und praktsich attraktiv
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -57552,8 +57518,7 @@
|
|||
...weil sie der „dann mach's halt nicht falsch“-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 — und wenn irgendjemand unbedingt dekorieren möchte, dann soll er halt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1737760037922" ID="ID_188274481" MODIFIED="1737760311471" TEXT="Variante-3 würde tatsächlich erweiterte Logik ermöglichen — erscheint aber fragwürdig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -57563,8 +57528,7 @@
|
|||
Weil das, was man nun zusätzlich machen könnte, nur auf Basis der Implementierung verständlich ist, aber fü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ß: 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>»Dekorieren«</i>  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ünde darin, die Referenzen nach der Zuweisung zu <i>materialisieren;</i>  aber die Schwierigkeit besteht darin dieses Linken auszulösen, da die ganze DSL darauf abstellt, Funktionen beliebig ineinander zu verschachteln, und damit sehr viel zu kopieren; man müßte dann entweder eine komplette Link-Infrastruktur hochziehen (Parser-Funktionen wären speziell als noch ungelinkt markiert und es gäbe einen separaten Call-Chain), oder man müß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ü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<RES>"/>
|
||||
<node CREATED="1737927839640" ID="ID_320293715" MODIFIED="1737927849187" TEXT="ForwardConnex<RES>"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737927867197" ID="ID_1443350587" MODIFIED="1737940527967" TEXT="maßgeschneiderte buildConnex(Syntax<OpaqueConnex>)">
|
||||
<node COLOR="#435e98" CREATED="1737927867197" FOLDED="true" ID="ID_1443350587" MODIFIED="1738091456117" TEXT="maßgeschneiderte buildConnex(Syntax<OpaqueConnex>)">
|
||||
<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ür geeigneten Ctor, um die Referenz zu akzeptieren"/>
|
||||
|
|
@ -57753,8 +57715,7 @@
|
|||
ausdefinierte Syntax <i>per Value</i> (!) 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überschieben"/>
|
||||
|
|
@ -57770,8 +57731,7 @@
|
|||
...es fällt mir schwer, keine Fehler-Checks zu machen, aber ein kurzer Versuch zeigt, daß diese so einiges Metaprogramming erfordern würden — und ich habe generell beschlossen, hier <b>keine Parser-Library</b> zu entwickeln, sondern <i>nur Abkürzungen für einfache Parse-Tasks,</i>  die jemand wie ich auch von Hand (per Rekursive-descent) schreiben könnte. In dem Fall bin ich also mal arrogant und warte, was passiert, denn ich kann mir nicht vorstellen, daß 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="»der Klassiker«">
|
||||
<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"> ::= </font><font face="Monospaced" color="#9b0338">T</font><font face="Monospaced"> [ + </font><font face="Monospaced" color="#e62a01"><b>E</b></font><font face="Monospaced"> ] </font>
|
||||
</p>
|
||||
<p>
|
||||
<font face="Monospaced" color="#9b0338">T</font><font face="Monospaced"> ::= </font><font face="Monospaced" color="#9b0338">F</font><font face="Monospaced"> [ / </font><font face="Monospaced" color="#9b0338">F</font><font face="Monospaced"> ] </font>
|
||||
</p>
|
||||
<p>
|
||||
<font face="Monospaced" color="#9b0338">F</font><font face="Monospaced"> ::= ( </font><font face="Monospaced" color="#e62a01"><b>E</b></font><font face="Monospaced"> ) | </font><font face="Monospaced" color="#9b0338">V</font>
|
||||
</p>
|
||||
<p>
|
||||
<font face="Monospaced" color="#9b0338">V</font><font face="Monospaced"> ::= </font><font face="Monospaced" color="#172eee">num</font><font face="Monospaced">   | </font><font face="Monospaced" color="#32777e">√</font><font face="Monospaced"> </font><font face="Monospaced" color="#172eee">num</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1738090083484" ID="ID_1980844178" MODIFIED="1738090093620" TEXT="binding ⟼ double">
|
||||
<node COLOR="#435e98" CREATED="1738090106160" ID="ID_1537756860" MODIFIED="1738090162305" TEXT="bequemere Notation fü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ü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> Syntax-Klausel sollte den beabsichtigten Ergebnistyp haben (hier double), sonst lä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 Φ 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="☺">
|
||||
<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ür verschachtelte Expressions">
|
||||
<node COLOR="#435e98" CREATED="1737509774878" ID="ID_1564220447" MODIFIED="1738091240280" TEXT="Beispiel fü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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue