Library: implement support for recursive syntax
The concept was indeed successful, albeit quite difficult to pull off in detail. It requires a carefully crafted path of Deduction guides and overloads to effect the switch from std::function to std::function& at the point where a predeclared syntax clause placeholder is used recursively
This commit is contained in:
parent
5e86aa3880
commit
ed5c6f7c17
3 changed files with 279 additions and 134 deletions
|
|
@ -70,6 +70,9 @@ namespace util {
|
|||
template<class PAR>
|
||||
class Syntax;
|
||||
|
||||
template<class CON>
|
||||
class Parser;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -97,10 +100,20 @@ namespace util {
|
|||
using Result = typename _Fun<PFun>::Ret::Result;
|
||||
|
||||
Connex (FUN pFun)
|
||||
: parse{move(pFun)}
|
||||
: parse{pFun}
|
||||
{ }
|
||||
};
|
||||
|
||||
/** special setup to be pre-declared and then used recursively */
|
||||
template<class RES>
|
||||
using OpaqueConnex = Connex<std::function<Eval<RES>(StrView)>>;
|
||||
|
||||
template<class RES>
|
||||
using ForwardConnex = Connex<std::function<Eval<RES>(StrView)>&>;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** »Null-Connex« which always successfully accepts the empty sequence */
|
||||
auto
|
||||
|
|
@ -166,6 +179,18 @@ namespace util {
|
|||
return Con{anchor};
|
||||
}
|
||||
|
||||
/** special setup to attach to a pre-defined clause for recursive syntax
|
||||
* @note works in concert with the Parser deduction guide, so that the
|
||||
* resulting ForwardConnex holds a _reference_ to std::function,
|
||||
* and thus gets to see the full definition reassigned later. */
|
||||
template<class RES>
|
||||
auto
|
||||
buildConnex (Syntax<Parser<OpaqueConnex<RES>>> & refClause)
|
||||
{
|
||||
OpaqueConnex<RES>& refConnex = refClause;
|
||||
return ForwardConnex<RES>{refConnex.parse};
|
||||
}
|
||||
|
||||
|
||||
|
||||
namespace {
|
||||
|
|
@ -182,6 +207,17 @@ namespace util {
|
|||
{ // probe the λ with ARG to force template instantiation
|
||||
using Ret = decltype(std::declval<FUN>() (std::declval<ARG>()));
|
||||
};
|
||||
|
||||
|
||||
template<class FUN>
|
||||
inline bool
|
||||
_boundFun(FUN const& fun)
|
||||
{
|
||||
if constexpr (std::is_constructible<bool, FUN const&>())
|
||||
return bool(fun);
|
||||
else
|
||||
return std::is_invocable<FUN, StrView>();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -580,6 +616,7 @@ namespace util {
|
|||
Eval<Result>
|
||||
operator() (StrView toParse)
|
||||
{
|
||||
REQUIRE (_boundFun (CON::parse), "unbound recursive syntax");
|
||||
return CON::parse (toParse);
|
||||
}
|
||||
|
||||
|
|
@ -596,10 +633,14 @@ namespace util {
|
|||
Parser(string const&) -> Parser<Term>;
|
||||
|
||||
template<class FUN>
|
||||
Parser(Connex<FUN> const&) -> Parser<Connex<FUN>>;
|
||||
Parser(Connex<FUN>) -> Parser<Connex<FUN>>;
|
||||
|
||||
template<class PAR>
|
||||
Parser(Syntax<PAR> const&) -> Parser<typename PAR::Connex>;
|
||||
Parser(Syntax<PAR>) -> Parser<typename PAR::Connex>;
|
||||
|
||||
template<class RES>
|
||||
Parser(Syntax<Parser<OpaqueConnex<RES>>>) -> Parser<ForwardConnex<RES>>;
|
||||
// bind to recursive syntax by reference
|
||||
|
||||
|
||||
/** @internal meta-helper : detect if parser can be built from a given type */
|
||||
|
|
@ -660,7 +701,8 @@ namespace util {
|
|||
|
||||
bool success() const { return bool(Syntax::result); }
|
||||
bool hasResult() const { return bool(Syntax::result); }
|
||||
size_t consumed() const { return Eval<Result>::consumed;}
|
||||
bool canInvoke() const { return _boundFun(parse_.parse);}
|
||||
size_t consumed() const { return Eval<Result>::consumed; }
|
||||
Result& getResult() { return * Syntax::result; }
|
||||
Result&& extractResult() { return move(getResult()); }
|
||||
|
||||
|
|
@ -676,6 +718,16 @@ namespace util {
|
|||
}
|
||||
|
||||
|
||||
template<class PX>
|
||||
Syntax&
|
||||
operator= (Syntax<PX> refSyntax)
|
||||
{
|
||||
using ConX = typename PX::Connex;
|
||||
ConX& refConnex = refSyntax;
|
||||
parse_.parse = move(refConnex.parse);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/** ===== Syntax clause builder DSL ===== */
|
||||
|
||||
|
|
@ -878,7 +930,23 @@ namespace util {
|
|||
}
|
||||
|
||||
|
||||
/** Setup an assignable, recursive Syntax clause, initially empty */
|
||||
/**
|
||||
* Setup an assignable, recursive Syntax clause, initially empty.
|
||||
* @remark this provides the foundation for recursive syntax clauses;
|
||||
* initially, an empty std::function with the pre-declared return
|
||||
* type is embedded. Together with a special Parser deduction guide,
|
||||
* later on a full syntax clause can be built, taking a _reference_
|
||||
* to this function; finally the definition prepared here should be
|
||||
* _re-assigned_ with the fully defined syntax, which is handled
|
||||
* by the assignment operator in class Syntax to re-assign a
|
||||
* working parser function into the std::function holder.
|
||||
* @tparam RES the result model type to be expected; it is necessary
|
||||
* to augment the full definition explicitly by a model-binding
|
||||
* to produce this type — which typically also involves writing
|
||||
* actual code to deal with the possibly open structure enable
|
||||
* through a recursive syntax definition
|
||||
* @see Parse_test::verify_recursiveSyntax()
|
||||
*/
|
||||
template<typename RES>
|
||||
auto
|
||||
expectResult()
|
||||
|
|
|
|||
|
|
@ -624,9 +624,27 @@ namespace test {
|
|||
void
|
||||
verify_recursiveSyntax()
|
||||
{
|
||||
auto recursive = expectResult<int>();
|
||||
auto recurse = expectResult<int>();
|
||||
CHECK (not recurse.canInvoke());
|
||||
|
||||
recurse = accept("great")
|
||||
.opt(accept("!")
|
||||
.seq(recurse))
|
||||
.bind([](auto m) -> int
|
||||
{
|
||||
auto& [_,r] = m;
|
||||
return 1 + (r? get<1>(*r):0);
|
||||
});
|
||||
CHECK (recurse.canInvoke());
|
||||
|
||||
string s1{"great ! great ! great"};
|
||||
recurse.parse(s1);
|
||||
CHECK (recurse.success());
|
||||
CHECK (recurse.getResult() == 3 );
|
||||
|
||||
CHECK (not recurse.parse(" ! great"));
|
||||
CHECK (recurse.parse("great ! great actor").getResult() == 2);
|
||||
CHECK (recurse.parse("great ! great ! actor").getResult() == 2);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -56776,7 +56776,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1737514258866" ID="ID_1304545890" MODIFIED="1737514379504" TEXT="(optional) Trenner mit 1-Fall-Behandlung">
|
||||
<node CREATED="1737514258866" FOLDED="true" ID="ID_1304545890" MODIFIED="1737514379504" TEXT="(optional) Trenner mit 1-Fall-Behandlung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -56808,7 +56808,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737514608995" ID="ID_1247344786" MODIFIED="1737581143659" TEXT="Zahl der Iterationen und Modell-Repräsentation?">
|
||||
<node COLOR="#435e98" CREATED="1737514608995" FOLDED="true" ID="ID_1247344786" MODIFIED="1737581143659" TEXT="Zahl der Iterationen und Modell-Repräsentation?">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1737514625345" ID="ID_417722298" MODIFIED="1737514657151" TEXT="Konsequenz: offen ⟹ kann kein Array sein"/>
|
||||
|
|
@ -56854,7 +56854,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1737557808392" ID="ID_529869533" MODIFIED="1737581104395" TEXT="DSL-Varianten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1737560210100" ID="ID_877662499" MODIFIED="1737569762631" TEXT="Spezifikations-Schema">
|
||||
<node COLOR="#435e98" CREATED="1737560210100" FOLDED="true" ID="ID_877662499" MODIFIED="1737569762631" TEXT="Spezifikations-Schema">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#5b280f" CREATED="1737560240722" ID="ID_1633583353" MODIFIED="1737560259824" TEXT="eigentständige top-level syntax">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
|
|
@ -56934,7 +56934,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1737515398692" ID="ID_1478704437" MODIFIED="1737515413091" TEXT="der ist einfach zu realisieren und sehr nützlich"/>
|
||||
<node CREATED="1737515413799" ID="ID_1235063232" MODIFIED="1737515424929" TEXT="das Model wird in einen std::optional gewickelt"/>
|
||||
<node BACKGROUND_COLOR="#e5d4c6" COLOR="#435e98" CREATED="1737515765304" ID="ID_692646776" MODIFIED="1737686075882" TEXT="per postfix-Operator darstellbar?">
|
||||
<node BACKGROUND_COLOR="#e5d4c6" COLOR="#435e98" CREATED="1737515765304" FOLDED="true" ID="ID_692646776" MODIFIED="1737940841466" TEXT="per postfix-Operator darstellbar?">
|
||||
<icon BUILTIN="help"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1737552397609" ID="ID_411565433" MODIFIED="1737552415673">
|
||||
|
|
@ -57023,9 +57023,7 @@
|
|||
<node CREATED="1737762977024" ID="ID_1561603785" MODIFIED="1737762981006" TEXT="Basis-Implementierung">
|
||||
<node CREATED="1737762981897" ID="ID_1090727371" MODIFIED="1737763001027" TEXT="ist schon da">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
nebenbei abgefallen
|
||||
|
|
@ -57041,9 +57039,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1737763027300" ID="ID_681702080" MODIFIED="1737763052404">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>das</i> muß tatsächlich ein <b>Postfix-Operator</b> sein
|
||||
|
|
@ -57055,9 +57051,7 @@
|
|||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737763069414" ID="ID_1049523751" MODIFIED="1737849866205">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Vorschlag: <font face="Monospaced"><b>bind</b>(</font><font face="Monospaced" color="#642929">FUN</font><font face="Monospaced">)</font>
|
||||
|
|
@ -57066,11 +57060,9 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737763165990" ID="ID_1051966220" MODIFIED="1737775439645" TEXT="wichtig: static-assertion bieten">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737763165990" FOLDED="true" ID="ID_1051966220" MODIFIED="1737940855527" TEXT="wichtig: static-assertion bieten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
damit klar gesagt wird, wenn die Funktion nicht den bisherigen Result-Typ nimmt
|
||||
|
|
@ -57105,9 +57097,7 @@
|
|||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737763306315" ID="ID_556563323" MODIFIED="1737849862021">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Standard-Variante: <font face="Monospaced"><b>bindMatch</b>(n)</font>
|
||||
|
|
@ -57116,13 +57106,11 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1737817661406" ID="ID_74788283" MODIFIED="1737817685150" TEXT="auf Matcher ⟼ match-group"/>
|
||||
<node CREATED="1737817685762" ID="ID_522207502" MODIFIED="1737844301800" TEXT="eine Verallgemeinerung versuchen">
|
||||
<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"/>
|
||||
<node COLOR="#5b280f" CREATED="1737818191905" ID="ID_253639135" MODIFIED="1737818824310" TEXT="diese Verzweigung in der Builder-Methode machen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...denn es steuert die Art der Dekoration
|
||||
|
|
@ -57146,9 +57134,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1737819592756" ID="ID_634105899" MODIFIED="1737820210832" TEXT="dann auch besser als toStringConnex ">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
analog wie die anderen Combinatoren und buildConnex()
|
||||
|
|
@ -57163,9 +57149,7 @@
|
|||
<node COLOR="#435e98" CREATED="1737820230519" ID="ID_4755618" MODIFIED="1737845408706" TEXT="repetitiever Code ⟹ vereinfachen">
|
||||
<node CREATED="1737844669441" ID="ID_82924290" MODIFIED="1737844753235" TEXT="jetzt viel einfacher...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
nachdem ich die Model-Fälle wegdiskutiert habe ☺
|
||||
|
|
@ -57182,10 +57166,14 @@
|
|||
</node>
|
||||
<node CREATED="1737817759473" ID="ID_1259641042" MODIFIED="1737820162400" TEXT="0 ⟼ insgesamt abgedeckten String">
|
||||
<arrowlink COLOR="#d21839" DESTINATION="ID_580741187" ENDARROW="Default" ENDINCLINATION="-152;6;" ID="Arrow_ID_1339747714" STARTARROW="None" STARTINCLINATION="21;-32;"/>
|
||||
<node CREATED="1737818264773" ID="ID_120023356" MODIFIED="1737818272264" TEXT="genereller fall-Back"/>
|
||||
<node CREATED="1737818273492" ID="ID_1978233039" MODIFIED="1737818392552" TEXT="damit fehlertolerant"/>
|
||||
<node CREATED="1737818264773" ID="ID_120023356" MODIFIED="1737940794564" TEXT="genereller fall-Back">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1737844303914" ID="ID_533069226" MODIFIED="1737844325844" TEXT="auf compound-Model ⟼ Teilkomponente">
|
||||
<node COLOR="#435e98" CREATED="1737818273492" ID="ID_1978233039" MODIFIED="1737940790395" TEXT="damit fehlertolerant">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1737844303914" FOLDED="true" ID="ID_533069226" MODIFIED="1737940755686" TEXT="auf compound-Model ⟼ Teilkomponente">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1737844326911" ID="ID_276945387" MODIFIED="1737844341721" TEXT="wird sehr komplex umzusetzen"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737820277891" ID="ID_1885712747" MODIFIED="1737844365946" TEXT="Problem: es sind variadic-templates">
|
||||
|
|
@ -57197,9 +57185,7 @@
|
|||
<node CREATED="1737844371498" ID="ID_641248746" MODIFIED="1737844388561" TEXT="man müßte mit allen misch-Fällen umgehen können"/>
|
||||
<node CREATED="1737844390141" ID="ID_730168468" MODIFIED="1737844538602" TEXT="und was dann machen....?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
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??
|
||||
|
|
@ -57210,9 +57196,7 @@
|
|||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1737844404123" ID="ID_1490711015" MODIFIED="1737844630457" TEXT="Nutzen zweifelhaft">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
wozu will man das? doch nur für Tests.
|
||||
|
|
@ -57245,9 +57229,7 @@
|
|||
<node COLOR="#435e98" CREATED="1737843950560" ID="ID_77042913" MODIFIED="1737849817609" TEXT="klären warum structured Bindings nicht funktionieren">
|
||||
<node CREATED="1737849641960" ID="ID_510578678" MODIFIED="1737849815956" TEXT="Grund: std::tuple_size nicht spezialisiert ⟹ biegt in Struct-Binding ab">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
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)
|
||||
|
|
@ -57273,9 +57255,7 @@
|
|||
<node CREATED="1737776795928" ID="ID_935270717" MODIFIED="1737776813345" TEXT="es kommt zweimal der bind-match vom ersten Wort"/>
|
||||
<node CREATED="1737817572295" ID="ID_1167831095" MODIFIED="1737817616236">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
ganz banal: habe <font face="Monospaced">eval.consumed</font> nicht weitergegeben
|
||||
|
|
@ -57284,9 +57264,7 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
d.h. jede sub-expression setzt wieder am Anfang auf
|
||||
|
|
@ -57306,27 +57284,35 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737515362910" ID="ID_1587990202" MODIFIED="1737850611368" TEXT="offene Rekursion">
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1737515599278" ID="ID_1897353084" MODIFIED="1737515606925" TEXT="schwierige Frage....">
|
||||
<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"/>
|
||||
<node CREATED="1737515610957" ID="ID_1394504016" MODIFIED="1737515628606" TEXT="es ist natürlich ein Kern-Feature von recursive-descent"/>
|
||||
<node CREATED="1737515630666" ID="ID_635140645" MODIFIED="1737553351887" TEXT="es ist notwendig für Dinge wie verschachtelte Ausdrücke">
|
||||
<node CREATED="1737515610957" ID="ID_1394504016" MODIFIED="1737940891748" TEXT="es ist natürlich ein Kern-Feature von recursive-descent">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<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="1737515948915" TEXT="nicht als Inline-Model darstellbar">
|
||||
<node CREATED="1737515930491" ID="ID_72368755" MODIFIED="1737940896885" 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>
|
||||
<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;"/>
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1737693819337" ID="ID_228574257" MODIFIED="1737761064544" TEXT="Implementierungs-Technik klären">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1737693835207" ID="ID_1616305471" MODIFIED="1737694295281" TEXT="grundsätzlich realisierbar in diesem Framework">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1737693819337" 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;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1737693849853" ID="ID_1927056535" MODIFIED="1737693956231" TEXT="ABER wir müssen dann die strikte Model-Typisierung abschneiden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
....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)
|
||||
|
|
@ -57348,10 +57334,10 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1737694065800" ID="ID_303092277" MODIFIED="1737761080042" TEXT="das stellt aber ein Lock-in dar">
|
||||
<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"/>
|
||||
<node CREATED="1737694102427" ID="ID_878363951" MODIFIED="1737694137594" TEXT="was ohnehin schon durch die Definition einer Syntax<PAR>-Instanz erfolgt"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1737694138462" ID="ID_837740353" MODIFIED="1737694189304" TEXT="Vorsicht �� können dann rekursive Systeme überhaupt formuliert werden?">
|
||||
<node BACKGROUND_COLOR="#dabdad" COLOR="#990033" CREATED="1737694138462" ID="ID_837740353" MODIFIED="1737940703820" TEXT="Vorsicht �� können dann rekursive Systeme überhaupt formuliert werden?">
|
||||
<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>
|
||||
|
|
@ -57379,16 +57365,17 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1737694569853" ID="ID_1483280295" MODIFIED="1737694574820" TEXT="und zwar auf Typ-Ebene">
|
||||
<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="-98;-174;" ID="Arrow_ID_1260672332" STARTARROW="None" STARTINCLINATION="-525;26;"/>
|
||||
<arrowlink COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="22;-101;" ID="Arrow_ID_1260672332" STARTARROW="None" STARTINCLINATION="-525;26;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1737738318817" ID="ID_1107737972" MODIFIED="1737751309871" TEXT="nochmal Vergleich mit existierenden Libraries">
|
||||
<node 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"/>
|
||||
|
|
@ -57413,8 +57400,8 @@
|
|||
<node CREATED="1737738723505" ID="ID_1018761314" MODIFIED="1737738748516" TEXT="im klassischen "Calculator"-Beispiel wird dann ein Ergebnis-Stack verwendet"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737756303660" ID="ID_593591679" MODIFIED="1737761152655" TEXT="Unvermeidbare Einschränkung: User muß Result-Type explizit benennen">
|
||||
<linktarget COLOR="#fdfcce" DESTINATION="ID_593591679" ENDARROW="Default" ENDINCLINATION="-98;-174;" ID="Arrow_ID_1260672332" SOURCE="ID_64242861" STARTARROW="None" STARTINCLINATION="-525;26;"/>
|
||||
<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;"/>
|
||||
<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"/>
|
||||
|
|
@ -57465,7 +57452,7 @@
|
|||
</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 BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737762884132" HGAP="23" ID="ID_1097242773" MODIFIED="1737762918245" TEXT="⟹ das muß das nächste Thema sein" VSHIFT="10">
|
||||
<node COLOR="#753c48" CREATED="1737762884132" HGAP="23" ID="ID_1097242773" MODIFIED="1737940733425" TEXT="⟹ das muß das nächste Thema sein" VSHIFT="10">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -57480,7 +57467,7 @@
|
|||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1737757530355" ID="ID_38602384" MODIFIED="1737757618234" TEXT="Einstiegs-Punkt: eine Syntax wird vordeklariert">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737757530355" ID="ID_38602384" MODIFIED="1737940570797" TEXT="Einstiegs-Punkt: eine Syntax wird vordeklariert">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1737757552386" ID="ID_193170390" MODIFIED="1737757558213" TEXT="expect<RES>()"/>
|
||||
<node CREATED="1737757736924" ID="ID_845564019" MODIFIED="1737757760362" TEXT="Type-Tag ⟹ macht den Connex zuweisbar"/>
|
||||
|
|
@ -57488,7 +57475,8 @@
|
|||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1737757864319" ID="ID_1384035666" MODIFIED="1737757887112" TEXT="das heißt, außer dem Type-Tag sollte sich die Syntax komplett normal verhalten"/>
|
||||
<node CREATED="1737757888884" ID="ID_1542863836" MODIFIED="1737757914004" TEXT="im Parse passiert eine Indirektion (normalerweise transparent)"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1737757927671" ID="ID_100422313" MODIFIED="1737758161080" TEXT="was machen nachfolgende Dekorationen?">
|
||||
<node COLOR="#3e12bf" CREATED="1737757927671" ID="ID_100422313" MODIFIED="1737940605426" TEXT="was machen nachfolgende Dekorationen?">
|
||||
<arrowlink COLOR="#2812bf" DESTINATION="ID_1430169629" ENDARROW="Default" ENDINCLINATION="-120;-12;" ID="Arrow_ID_1674350447" STARTARROW="None" STARTINCLINATION="4;52;"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1737758174587" ID="ID_29086225" MODIFIED="1737758222499" TEXT="mögliche Varianten">
|
||||
<node CREATED="1737758223415" ID="ID_1731735440" MODIFIED="1737758228534" TEXT="nichts speziell">
|
||||
|
|
@ -57527,9 +57515,7 @@
|
|||
<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)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
diese andere Syntax hätte dann aber auch einen anderen Typ und müßte in einer anderen Syntax-Variablen gespeichert werden;
|
||||
|
|
@ -57551,9 +57537,7 @@
|
|||
<node CREATED="1737758903192" ID="ID_447755008" MODIFIED="1737759845669" TEXT="Varianten-1 und 2 laufen auf die gleiche Verwendung hinaus"/>
|
||||
<node CREATED="1737759828390" ID="ID_1549999802" MODIFIED="1737760031271">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Variante-1 ist »filosofisch« und praktsich attraktiv
|
||||
|
|
@ -57562,9 +57546,7 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...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
|
||||
|
|
@ -57575,9 +57557,7 @@
|
|||
</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>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
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
|
||||
|
|
@ -57587,14 +57567,13 @@
|
|||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1737760312861" ID="ID_1430169629" MODIFIED="1737760337743" TEXT="Beschluß: Variante-1">
|
||||
<node COLOR="#3e12bf" CREATED="1737760312861" ID="ID_1430169629" MODIFIED="1737940605425" TEXT="Beschluß: Variante-1">
|
||||
<linktarget COLOR="#2812bf" DESTINATION="ID_1430169629" ENDARROW="Default" ENDINCLINATION="-120;-12;" ID="Arrow_ID_1674350447" SOURCE="ID_100422313" STARTARROW="None" STARTINCLINATION="4;52;"/>
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1737760340128" ID="ID_1904432675" MODIFIED="1737760536651" TEXT="Variante-2 wäre wünschenswert">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
da sie ohnehin das erlaubt was man machen sollte, aber Fehl-Verwendungen unterbindet
|
||||
|
|
@ -57605,9 +57584,7 @@
|
|||
</node>
|
||||
<node CREATED="1737760356767" ID="ID_523967840" MODIFIED="1737760483530" TEXT="ist aber in der Umsetzung unklar">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
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
|
||||
|
|
@ -57620,14 +57597,12 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1737760572436" ID="ID_1761010902" MODIFIED="1737760625364" TEXT="diese Forward-Deklarationen müssen dauerhaft bestehen bleiben">
|
||||
<node BACKGROUND_COLOR="#e9de9f" COLOR="#850649" CREATED="1737760572436" ID="ID_1761010902" MODIFIED="1737940630654" TEXT="diese Forward-Deklarationen müssen dauerhaft bestehen bleiben">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1737760626950" ID="ID_1746781945" MODIFIED="1737760654483" TEXT="damit die spätere Zuweisung klappt, müssen Referenzen verwendet werden"/>
|
||||
<node CREATED="1737760760265" ID="ID_1932015736" MODIFIED="1737760997909" TEXT="eine »high-tech-Lösung« wäre denkbar — erscheit aber zweifelhaft">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...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
|
||||
|
|
@ -57643,9 +57618,9 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737900281772" ID="ID_1448096788" MODIFIED="1737900299647" TEXT="Funktionalität ergänzen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737900357508" ID="ID_1812575904" MODIFIED="1737902053232" TEXT="opaqueConnex">
|
||||
<node COLOR="#338800" CREATED="1737900281772" ID="ID_1448096788" MODIFIED="1737931646416" TEXT="Funktionalität ergänzen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1737900357508" ID="ID_1812575904" MODIFIED="1737931377725" TEXT="opaqueConnex">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1737900423425" ID="ID_1797162357" MODIFIED="1737900451668" TEXT="parse function is type-erased"/>
|
||||
<node CREATED="1737900453103" ID="ID_1367568195" MODIFIED="1737900551119" TEXT="FUN ≡ std::function"/>
|
||||
|
|
@ -57653,35 +57628,34 @@
|
|||
<node CREATED="1737900569320" ID="ID_1096113156" MODIFIED="1737900574986" TEXT="ist zuweisbar"/>
|
||||
<node CREATED="1737900578558" ID="ID_344632892" MODIFIED="1737900631289" TEXT="(Zuweisbarkeit) dient auch als type-Tag"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737900639590" ID="ID_1759226520" MODIFIED="1737902126147" TEXT="ansonsten: nichts zu tun">
|
||||
<node BACKGROUND_COLOR="#e4eda1" COLOR="#001299" CREATED="1737900639590" ID="ID_1759226520" MODIFIED="1737931399567" STYLE="fork" TEXT="ansonsten: „nichts“ zu tun">
|
||||
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
|
||||
<arrowlink COLOR="#f6fec6" DESTINATION="ID_677433286" ENDARROW="Default" ENDINCLINATION="-25;-71;" ID="Arrow_ID_47317323" STARTARROW="None" STARTINCLINATION="-19;2;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1737900687256" ID="ID_1682593770" MODIFIED="1737900709225" TEXT="Steuerung über das Konstruktor-Argument"/>
|
||||
<node CREATED="1737900726635" ID="ID_844484749" MODIFIED="1737900746868" TEXT="anlegen durch eine leere std::function"/>
|
||||
<node CREATED="1737900687256" ID="ID_1682593770" MODIFIED="1737931373039" TEXT="Steuerung über das Konstruktor-Argument"/>
|
||||
<node CREATED="1737900726635" ID="ID_844484749" MODIFIED="1737931373039" TEXT="anlegen durch eine leere std::function"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737900361556" ID="ID_1323300092" MODIFIED="1737902053232" TEXT="forwardConnex">
|
||||
<node COLOR="#435e98" CREATED="1737900361556" ID="ID_1323300092" MODIFIED="1737931379863" TEXT="forwardConnex">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1737901815146" ID="ID_248887267" MODIFIED="1737901826492" TEXT="Referenz auf einen anderen Connex"/>
|
||||
<node CREATED="1737900453103" ID="ID_432272475" MODIFIED="1737901850195">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
FUN ≡ std::function <font color="#9b0202">&</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737931633450" ID="ID_1828235175" MODIFIED="1737931640249" TEXT="als Typedef formulieren">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737901890719" ID="ID_677433286" MODIFIED="1737902114644">
|
||||
<node BACKGROUND_COLOR="#e4eda1" COLOR="#001299" CREATED="1737901890719" ID="ID_677433286" MODIFIED="1737931404261" STYLE="fork">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Connex-Definition
|
||||
|
|
@ -57690,27 +57664,25 @@
|
|||
erfüllt das bereits
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#f6fec6" DESTINATION="ID_677433286" ENDARROW="Default" ENDINCLINATION="-25;-71;" ID="Arrow_ID_47317323" SOURCE="ID_1759226520" STARTARROW="None" STARTINCLINATION="-19;2;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737901921332" ID="ID_969187731" MODIFIED="1737901935953" TEXT="Connex ist ein low-level-Konstrukt">
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1737901921332" ID="ID_969187731" MODIFIED="1737931404259" TEXT="Connex ist ein low-level-Konstrukt">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1737901937041" ID="ID_25503755" MODIFIED="1737901942778" TEXT="deshalb haben wir den Parser">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1737901944289" ID="ID_1298401085" MODIFIED="1737901960594" TEXT="der darüber liegende Code sorgt für den richtigen Zugang"/>
|
||||
<node CREATED="1737901944289" ID="ID_1298401085" MODIFIED="1737931404259" TEXT="der darüber liegende Code sorgt für den richtigen Zugang"/>
|
||||
</node>
|
||||
<node CREATED="1737902212717" ID="ID_1611321813" MODIFIED="1737902236666" TEXT="umstellen...">
|
||||
<node CREATED="1737902237690" ID="ID_1997654816" MODIFIED="1737903301670" TEXT="NonAssign ⟶ beliebig kopierbar und zuweisbar">
|
||||
<node CREATED="1737903172029" ID="ID_1448785140" MODIFIED="1737903181056" TEXT="die ganze Unterscheidung war künstlich"/>
|
||||
<node CREATED="1737903181956" ID="ID_395623810" MODIFIED="1737903192030" TEXT="die Weichen werden auf DSL-Ebene gestellt"/>
|
||||
<node CREATED="1737902212717" ID="ID_1611321813" MODIFIED="1737931404259" TEXT="umstellen...">
|
||||
<node CREATED="1737902237690" ID="ID_1997654816" MODIFIED="1737931440641" TEXT="NonAssign ⟶ beliebig kopierbar und zuweisbar">
|
||||
<arrowlink COLOR="#0d5ec0" DESTINATION="ID_909721103" ENDARROW="Default" ENDINCLINATION="1;-37;" ID="Arrow_ID_1649313759" STARTARROW="None" STARTINCLINATION="-118;7;"/>
|
||||
<node CREATED="1737903172029" ID="ID_1448785140" MODIFIED="1737931404259" TEXT="die ganze Unterscheidung war künstlich"/>
|
||||
<node CREATED="1737903181956" ID="ID_395623810" MODIFIED="1737931404259" TEXT="die Weichen werden auf DSL-Ebene gestellt"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737903192730" ID="ID_1283071351" MODIFIED="1737903229001" TEXT="und dort oft auf gefährliche Weise">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
da viele Builder-Funktionen in ein neues Syntax-Objekt schieben
|
||||
|
|
@ -57729,16 +57701,95 @@
|
|||
<node CREATED="1737901996833" ID="ID_1612965331" MODIFIED="1737902030982" TEXT="denn das Fehler-Schema muß in den Connex abgelegt werden"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1737928226021" ID="ID_1934790072" MODIFIED="1737928238887" TEXT="Zuweisung an die Funktion explizit in Syntax realisieren"/>
|
||||
<node COLOR="#338800" CREATED="1737903254242" ID="ID_909721103" MODIFIED="1737931440641" TEXT="Initialisierung der Referenz">
|
||||
<linktarget COLOR="#0d5ec0" DESTINATION="ID_909721103" ENDARROW="Default" ENDINCLINATION="1;-37;" ID="Arrow_ID_1649313759" SOURCE="ID_1997654816" STARTARROW="None" STARTINCLINATION="-118;7;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#d2bbc9" CREATED="1737927753932" ID="ID_317012062" MODIFIED="1737940548945" TEXT="das ist technisch anspruchsvoll...">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1737900294630" ID="ID_770847444" MODIFIED="1737900299648" TEXT="in DSL einbinden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1737903350357" ID="ID_870130978" MODIFIED="1737903359576" TEXT="expectResult<RES>()">
|
||||
<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="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 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"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1737927948026" ID="ID_1038319555" MODIFIED="1737931476350" TEXT="Lösung: Value-construct, kein move">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1737927968957" ID="ID_1311369405" MODIFIED="1737927995199" TEXT="die move/copy-Unterscheidung passiert im Argument"/>
|
||||
<node CREATED="1737927995860" ID="ID_1053841178" MODIFIED="1737931531011" TEXT="dann schreiben wir aber eine unnötige Kopie im member-Init"/>
|
||||
<node CREATED="1737928009314" ID="ID_752029743" MODIFIED="1737931615719" TEXT="der Optimiser soll das richten (sehe keine andere Lösung)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
es sei denn, man würde Connex komplett aufdoppeln für den Referenz-Fall (wobei ärgerlicherweise wirklich aller Code identisch wäre, bis auf eine Variante im Konstruktor). Natürlich habe ich auch versucht, nur den Konstruktor allein zu spezialisieren, das ist mir aber nicht gelungen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1737928015241" ID="ID_284506355" MODIFIED="1737931622739" TEXT="dafür bekommen wir nun auch eine Referenz durch"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c5aaab" COLOR="#bf0dc0" CREATED="1737928039006" ID="ID_476963617" MODIFIED="1737932121902" TEXT="puh ... mehrere Stunden Knobelei">
|
||||
<linktarget COLOR="#a670c5" DESTINATION="ID_476963617" ENDARROW="Default" ENDINCLINATION="63;87;" ID="Arrow_ID_1307955722" SOURCE="ID_1965092419" STARTARROW="None" STARTINCLINATION="391;0;"/>
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1737928226021" ID="ID_1934790072" MODIFIED="1737932003225" TEXT="Zuweisung an die Funktion explizit in Syntax realisieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1737931648229" ID="ID_1083371316" MODIFIED="1737932028968" TEXT="muß dafür einen eigenen cross-Assignment-Operator schreiben">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1737932034900" ID="ID_1173496187" MODIFIED="1737932055544">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
ausdefinierte Syntax <i>per Value</i> (!) nehmen
|
||||
</p>
|
||||
</body>
|
||||
</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"/>
|
||||
</node>
|
||||
<node CREATED="1737931662217" ID="ID_91260604" MODIFIED="1737931677399" TEXT="verzichte hier (und auch sonstwo) bewußt auf alle Checks">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1737931682044" ID="ID_850275819" MODIFIED="1737931998586" TEXT="(das ist angemessen hier)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...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>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1737900294630" ID="ID_770847444" MODIFIED="1737932135453" TEXT="in DSL einbinden">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1737903350357" ID="ID_870130978" MODIFIED="1737940521807" TEXT="expectResult<RES>()">
|
||||
<node CREATED="1737903366802" ID="ID_806063281" MODIFIED="1737903376846" TEXT="bewußt ein sehr expliziter Name!">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1737903380886" ID="ID_1444141146" MODIFIED="1737903395440" TEXT="legt ein leeres Platzhalter-Syntax-Objekt an"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737932089739" ID="ID_1965092419" MODIFIED="1737940523039" TEXT="Anpassungen um per accept(syntax) eine Referenz aufzugreifen">
|
||||
<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">
|
||||
<arrowlink COLOR="#69a19e" DESTINATION="ID_1564220447" ENDARROW="Default" ENDINCLINATION="365;-30;" ID="Arrow_ID_30873436" STARTARROW="None" STARTINCLINATION="-288;17;"/>
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1737048820482" ID="ID_235554745" MODIFIED="1737048832524" TEXT="generisches Model-Binding"/>
|
||||
|
|
@ -57801,6 +57852,14 @@
|
|||
</node>
|
||||
<node COLOR="#435e98" CREATED="1737850587657" ID="ID_1051789530" MODIFIED="1737850597849" TEXT="was anderes als strings erzeugen"/>
|
||||
</node>
|
||||
<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">
|
||||
<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">
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1737845314577" ID="ID_453689160" MODIFIED="1737845324102" TEXT="puh ... was zeigen wir da?">
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue