Invocation: can now ''just parse'' the argument spec

can you imagine?
spell out that convoluted syntax, and it just works!!!
This commit is contained in:
Fischlurch 2025-02-01 02:21:34 +01:00
parent bd70c5faec
commit 5c2b6b69f6
4 changed files with 232 additions and 76 deletions

View file

@ -220,7 +220,7 @@ namespace util {
/** »Null-Connex« which always successfully accepts the empty sequence */
auto
inline auto
buildConnex(NullType)
{
return Connex{[](StrView) -> Eval<NullType>
@ -239,7 +239,7 @@ namespace util {
* returns an \ref Eval context, to hold a _Result Model_ and
* the number of characters matched by this terminal symbol.
*/
auto
inline auto
buildConnex (regex rex)
{
return Connex{[regEx = move(rex)]
@ -255,7 +255,7 @@ namespace util {
using Term = decltype(buildConnex (std::declval<regex>()));
/** build from a string with Regular-Epression spec */
Term
inline Term
buildConnex (string const& rexDef)
{
return buildConnex (regex{rexDef});
@ -263,20 +263,20 @@ namespace util {
/** copy-builder from an existing parser function */
template<class FUN>
auto
inline auto
buildConnex (Connex<FUN> const& anchor)
{
return Connex{anchor};
}
template<class FUN>
auto
inline auto
buildConnex (Connex<FUN> && anchor)
{
return Connex{move(anchor)};
}
template<class PAR>
auto
inline auto
buildConnex (Syntax<PAR> const& anchor)
{
using Con = typename Syntax<PAR>::Connex;
@ -288,7 +288,7 @@ namespace util {
* resulting ForwardConnex holds a _reference_ to std::function,
* and thus gets to see the full definition reassigned later. */
template<class RES>
auto
inline auto
buildConnex (Syntax<Parser<OpaqueConnex<RES>>> & refClause)
{
OpaqueConnex<RES>& refConnex = refClause;
@ -331,7 +331,7 @@ namespace util {
* and thus the parse can be configured to produce custom result data.
*/
template<class CON, class BIND>
auto
inline auto
adaptConnex (CON&& connex, BIND&& modelBinding)
{
using RX = typename CON::Result;
@ -352,7 +352,7 @@ namespace util {
}
template<class CON>
auto
inline auto
toStringConnex (CON&& connex, uint part)
{
using Result = typename CON::Result;
@ -519,7 +519,7 @@ namespace util {
/** accept sequence of two parse functions */
template<class C1, class C2>
auto
inline auto
sequenceConnex (C1&& connex1, C2&& connex2)
{
using R1 = typename decay_t<C1>::Result;
@ -553,7 +553,7 @@ namespace util {
/** accept either one of two alternative parse functions */
template<class C1, class C2>
auto
inline auto
branchedConnex (C1&& connex1, C2&& connex2)
{
using R1 = typename decay_t<C1>::Result;
@ -588,7 +588,7 @@ namespace util {
/** repeatedly accept parse-function, optionally delimited. */
template<class C1, class C2>
auto
inline auto
repeatedConnex (uint min, uint max
,C1&& delimConnex
,C2&& bodyConnex)
@ -631,7 +631,7 @@ namespace util {
/** try to accept parse-function, backtracking if not successful. */
template<class CNX>
auto
inline auto
optionalConnex (CNX&& connex)
{
using Res = typename decay_t<CNX>::Result;
@ -653,7 +653,7 @@ namespace util {
/** accept some structure enclosed into a bracketing construct.
* \param isOptional if the bracketing can be omitted */
template<class C1, class C2, class C3>
auto
inline auto
bracketedConnex (C1&& openingConnex
,C2&& closingConnex
,C3&& bodyConnex
@ -885,19 +885,19 @@ namespace util {
/** build a Syntax clause from anything usable as parser-spec. */
template<typename SPEC>
auto
inline auto
accept (SPEC&& clauseDef)
{
return Syntax{Parser{forward<SPEC> (clauseDef)}};
}
/** empty Syntax clause to start further definition */
auto accept() { return Syntax<Parser<NulP>>{}; }
inline auto accept() { return Syntax<Parser<NulP>>{}; }
/** start Syntax clause with an optional syntax part */
template<typename SPEC>
auto
inline auto
accept_opt (SPEC&& clauseDef)
{
return accept(
@ -913,7 +913,7 @@ namespace util {
* which implies it is a vector (uses heap storage); if min 0, the model can be empty.
*/
template<typename SPEC1, typename SPEC2>
auto
inline auto
accept_repeated (uint min, uint max, SPEC1&& delimDef, SPEC2&& clauseDef)
{
if (max<min)
@ -930,7 +930,7 @@ namespace util {
/** \param cnt exact number of repetitions expected */
template<typename SPEC1, typename SPEC2, typename =if_acceptableSpecs<SPEC1,SPEC2>>
auto
inline auto
accept_repeated (uint cnt, SPEC1&& delimDef, SPEC2&& clauseDef)
{
return accept_repeated (cnt,cnt, forward<SPEC1>(delimDef), forward<SPEC2>(clauseDef));
@ -938,28 +938,28 @@ namespace util {
/** start Syntax with an arbitrarily repeated sub-clause, with separator */
template<typename SPEC1, typename SPEC2, typename =if_acceptableSpecs<SPEC1,SPEC2>>
auto
inline auto
accept_repeated (SPEC1&& delimDef, SPEC2&& clauseDef)
{
return accept_repeated (1,uint(-1), forward<SPEC1>(delimDef), forward<SPEC2>(clauseDef));
}
template<typename SPEC>
auto
inline auto
accept_repeated (uint min, uint max, SPEC&& clauseDef)
{
return accept_repeated (min, max, NullType{}, forward<SPEC>(clauseDef));
}
template<typename SPEC>
auto
inline auto
accept_repeated (uint cnt, SPEC&& clauseDef)
{
return accept_repeated (cnt, NullType{}, forward<SPEC>(clauseDef));
}
template<typename SPEC>
auto
inline auto
accept_repeated (SPEC&& clauseDef)
{
return accept_repeated (NullType{}, forward<SPEC>(clauseDef));
@ -972,7 +972,7 @@ namespace util {
* the full sequence `open body close` can be matched.
*/
template<typename SPEC1, typename SPEC2, typename SPEC3>
auto
inline auto
accept_bracket (SPEC1&& openDef, SPEC2&& closeDef, SPEC3&& bodyDef)
{
return accept(
@ -988,7 +988,7 @@ namespace util {
* \param bracketSpec a 2-char string, e.g. "{}" to expect curly braces.
*/
template<typename SPEC>
auto
inline auto
accept_bracket (string bracketSpec, SPEC&& bodyDef)
{
if (bracketSpec.size() != 2)
@ -1003,7 +1003,7 @@ namespace util {
/** Start Syntax with a sub-clause enclosed in parentheses */
template<typename SPEC>
auto
inline auto
accept_bracket (SPEC&& bodyDef)
{
return accept_bracket ("()", forward<SPEC>(bodyDef));
@ -1011,7 +1011,7 @@ namespace util {
/** Start Syntax with a sub-clause, _optionally_ enclosed into brackets. */
template<typename SPEC>
auto
inline auto
accept_bracketOpt (string bracketSpec, SPEC&& bodyDef)
{
if (bracketSpec.size() != 2)
@ -1025,7 +1025,7 @@ namespace util {
}
template<typename SPEC>
auto
inline auto
accept_bracketOpt (SPEC&& bodyDef)
{
return accept_bracketOpt ("()", forward<SPEC>(bodyDef));
@ -1050,7 +1050,7 @@ namespace util {
* @see Parse_test::verify_recursiveSyntax()
*/
template<typename RES>
auto
inline auto
expectResult()
{
return accept (Connex{std::function<Eval<RES>(StrView)>{}});
@ -1068,7 +1068,7 @@ namespace util {
*/
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::seq (SPEC&& clauseDef)
{
return accept(
@ -1090,7 +1090,7 @@ namespace util {
*/
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::alt (SPEC&& clauseDef)
{
return accept(
@ -1106,7 +1106,7 @@ namespace util {
*/
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::opt (SPEC&& clauseDef)
{
return seq (accept_opt (forward<SPEC> (clauseDef)));
@ -1119,7 +1119,7 @@ namespace util {
*/
template<class PAR>
template<typename SPEC1, typename SPEC2>
auto
inline auto
Syntax<PAR>::repeat (uint min, uint max, SPEC1&& delimDef, SPEC2&& clauseDef)
{
return seq (accept_repeated (min,max
@ -1129,7 +1129,7 @@ namespace util {
template<class PAR>
template<typename SPEC1, typename SPEC2>
auto
inline auto
Syntax<PAR>::repeat (uint cnt, SPEC1&& delimDef, SPEC2&& clauseDef)
{
return seq (accept_repeated (cnt
@ -1139,7 +1139,7 @@ namespace util {
template<class PAR>
template<typename SPEC1, typename SPEC2>
auto
inline auto
Syntax<PAR>::repeat (SPEC1&& delimDef, SPEC2&& clauseDef)
{
return seq (accept_repeated (forward<SPEC1>(clauseDef)
@ -1148,7 +1148,7 @@ namespace util {
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::repeat (SPEC&& clauseDef)
{
return seq (accept_repeated (forward<SPEC>(clauseDef)));
@ -1160,7 +1160,7 @@ namespace util {
*/
template<class PAR>
template<typename SPEC1, typename SPEC2, typename SPEC3>
auto
inline auto
Syntax<PAR>::bracket (SPEC1&& openDef, SPEC2&& closeDef, SPEC3&& bodyDef)
{
return seq (accept_bracket (forward<SPEC1>(openDef)
@ -1170,7 +1170,7 @@ namespace util {
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::bracket (string bracketSpec, SPEC&& bodyDef)
{
return seq (accept_bracket (move (bracketSpec)
@ -1179,7 +1179,7 @@ namespace util {
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::bracket (SPEC&& bodyDef)
{
return seq (accept_bracket (forward<SPEC>(bodyDef)));
@ -1187,7 +1187,7 @@ namespace util {
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::bracketOpt (string bracketSpec, SPEC&& bodyDef)
{
return seq (accept_bracketOpt (move (bracketSpec)
@ -1196,7 +1196,7 @@ namespace util {
template<class PAR>
template<typename SPEC>
auto
inline auto
Syntax<PAR>::bracketOpt (SPEC&& bodyDef)
{
return seq (accept_bracketOpt (forward<SPEC>(bodyDef)));
@ -1204,7 +1204,7 @@ namespace util {
template<class PAR>
template<class FUN>
auto
inline auto
Syntax<PAR>::bind (FUN&& modelAdapt)
{
return accept(
@ -1213,7 +1213,7 @@ namespace util {
}
template<class PAR>
auto
inline auto
Syntax<PAR>::bindMatch (uint group)
{
return accept(
@ -1226,6 +1226,7 @@ namespace util {
using parse::accept;
using parse::accept_opt;
using parse::accept_repeated;
using parse::accept_bracket;
}// namespace util

View file

@ -25,7 +25,7 @@
#include "lib/iter-explorer.hpp"
#include "lib/format-string.hpp"
#include "lib/format-util.hpp"
#include "lib/regex.hpp"
#include "lib/parse.hpp"
#include "lib/util.hpp"
#include <boost/functional/hash.hpp> /////////////////////////////////////////////////////TICKET #1391 is boost-hash the proper tool for this task?
@ -55,6 +55,54 @@ namespace engine {
auto res = symbRegistry.emplace (symbol);
symbol = *res.first;
}
/* ===== Parse nested spec ===== */
using util::parse::accept;
using util::parse::accept_bracket;
using util::parse::accept_repeated;
using util::parse::expectResult;
using lib::meta::NullType;
using std::regex;
const regex SPEC_CONTENT{R"_([^,\\\(\)\[\]{}<>"]+)_", regex::optimize};
const regex NON_QUOTE {R"_([^"\\]+)_" , regex::optimize};
const regex ESCAPE {R"_(\\.)_" , regex::optimize};
const regex COMMA {R"_(,)_" , regex::optimize};
const regex D_QUOTE {R"_(")_" , regex::optimize};
auto quoted = accept_repeated(accept(NON_QUOTE).alt(ESCAPE));
auto quote = accept_bracket(D_QUOTE,D_QUOTE, quoted);
template<char OPE, char CLO>
auto&
syntaxBracketed()
{
string esc{"\\"};
regex OPENING{esc+OPE};
regex CLOSING{esc+CLO};
regex NON_PAREN{R"_([^\\)_"+esc+OPE+esc+CLO+"]+"};
static auto paren = expectResult<NullType>();
auto parenContent = accept_repeated(accept(NON_PAREN)
.alt(ESCAPE)
.alt(quote)
.alt(paren));
paren = accept_bracket(OPENING,CLOSING, parenContent).bind([](auto){ return NullType{}; });
return paren;
}
auto specTermSyntax = accept_repeated(accept(SPEC_CONTENT)
.alt(ESCAPE)
.alt(quote)
.alt(syntaxBracketed<'(',')'>())
.alt(syntaxBracketed<'<','>'>())
.alt(syntaxBracketed<'[',']'>())
.alt(syntaxBracketed<'{','}'>())
)
.bindMatch();
} // (END) Details...
@ -209,12 +257,32 @@ namespace engine {
ProcID::ArgModel
ProcID::genArgModel()
{
using VecS = std::vector<string>;
VecS v1{"bla","blubb"};
VecS v2;
auto elms1 = lib::makeSeveral<const string>().appendAll(v1);
auto elms2 = lib::makeSeveral<const string>().appendAll(v2);
return ProcID::ArgModel{elms1.build(), elms2.build()};
auto argListSyntax = accept_bracket(accept_repeated(COMMA, specTermSyntax));
auto argSpecSyntax = accept(argListSyntax)
.opt(argListSyntax)
.bind([](auto model) -> ProcID::ArgModel
{
auto packageAsSeveral = [](std::vector<string>& parsedTerms)
{
return lib::makeSeveral<const string>()
.appendAll(parsedTerms);
};
auto [list1,list2] = model;
auto elms1 = packageAsSeveral(list1);
auto elms2 = list2? packageAsSeveral(*list2)
: lib::makeSeveral<const string>();
return ProcID::ArgModel{elms1.build(), elms2.build()};
});
argSpecSyntax.parse (argLists_);
if (not argSpecSyntax.success())
throw err::Invalid{_Fmt{"Unable to parse argument list. "
"Node:%s Spec:%s"}
% genProcName() % argLists_
};
return argSpecSyntax.extractResult();
}

View file

@ -83,6 +83,11 @@ namespace test {
ProcID::ArgModel arg2 = p2.genArgModel();
ProcID::ArgModel arg3 = p3.genArgModel();
SHOW_EXPR(join (arg1.iArg))
SHOW_EXPR(join (arg1.oArg))
SHOW_EXPR(join (arg2.iArg))
SHOW_EXPR(join (arg2.oArg))
SHOW_EXPR(join (arg3.iArg))
SHOW_EXPR(join (arg3.oArg))
UNIMPLEMENTED ("parse and evaluate");
}

View file

@ -105319,8 +105319,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
ich war blockiert mit dem testgetriebenen Ansatz, denn ich kann zwar jetzt Nodes bauen, aber nicht einfach verifizieren und dokumentieren, da&#223; sie korrekt verdrahtet sind.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738288616423" ID="ID_1286145380" MODIFIED="1738288759369" TEXT="in Erg&#xe4;nzung wird damit Diagnose-Funktionalit&#xe4;t aufgebaut">
<richcontent TYPE="NOTE"><html>
@ -105330,8 +105329,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
die gleiche Funktionalit&#228;t wird sp&#228;ter zur Problem-Diagnose ben&#246;tigt; also nichts performance-kritisches
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738288630853" ID="ID_929483195" MODIFIED="1738288876134" TEXT="produktiv gebraucht wird das zur Aufbereitung beim Build (&#x27fc; Cache-Key)">
<richcontent TYPE="NOTE"><html>
@ -105341,8 +105339,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
im Moment sieht's so aus, da&#223; der erzeugende Code im Library-Plug-In ohnehin von internen strukturierten Daten ausgeht, um daraus die Node-Spec <i>zu generieren.</i>&#160;Diese wird dann einmal beim Builde per Parse zerlegt und ggfs noch zus&#228;tzlich dekoriert, und das war's dann.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1736632885429" ID="ID_1285666886" MODIFIED="1736633401873" TEXT="in Input / Output-Teil zerlegen">
@ -105449,8 +105446,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
&#10233; alle <i>Deklarationen</i>&#160;zum Spec / Model dorthin
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738335743700" ID="ID_729101988" MODIFIED="1738335778129" TEXT="auch hier auf Footprint achten">
<icon BUILTIN="messagebox_warning"/>
@ -105477,7 +105473,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node CREATED="1738347634026" ID="ID_891035798" MODIFIED="1738347641955" TEXT="ArgumentModel anlegen">
<node COLOR="#338800" CREATED="1738347634026" ID="ID_891035798" MODIFIED="1738383492570" TEXT="ArgumentModel anlegen">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1738347643696" ID="ID_522386929" MODIFIED="1738347656236" TEXT="vector-Storage">
<icon BUILTIN="button_cancel"/>
<node CREATED="1738347663501" ID="ID_1464148521" MODIFIED="1738347671672" TEXT="ist zwar naheliegend...."/>
@ -105493,8 +105490,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
d.h. ArgumentModel k&#246;nnte eine Struct sein, und lediglich zus&#228;tzliche Informations-Funktionen bieten
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1738347757673" ID="ID_343200211" MODIFIED="1738347794623" TEXT="es gibt noch kein fill-by-move &#x27f9; nachr&#xfc;sten">
<icon BUILTIN="button_ok"/>
@ -105531,8 +105527,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
...mu&#223;te dazu erst mal eine Runde raus, dann hab ichs rasch gesehen...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
@ -105559,6 +105554,62 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1738364976050" ID="ID_192401035" MODIFIED="1738364993580" TEXT="damit jetzt nutzbar f&#xfc;r const-strings"/>
</node>
<node COLOR="#338800" CREATED="1738380551197" ID="ID_563411324" MODIFIED="1738383257673" TEXT="Spec-Grammatik zusammenstellen">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738380564510" ID="ID_1949018612" MODIFIED="1738383248412" TEXT="nach dem Schema in Parse_test::verify_nestedSpecTerms()">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1738380589746" ID="ID_180463287" MODIFIED="1738383244594" TEXT="aber alle RegExps statisch compilieren">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1738380602321" ID="ID_103601413" MODIFIED="1738383242621" TEXT="au&#xdf;erdem: Builder-Funktion f&#xfc;r &lt;geklammerte sub-Spec&gt;">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1738380625397" ID="ID_1784590181" MODIFIED="1738380638067" TEXT="Vorsicht: rekursive Klausel braucht dauerhafte Storage">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1738380639585" ID="ID_600115874" MODIFIED="1738380655248" TEXT="verwende getemplatete Funktion und darin eine statische Variable">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1738380659209" ID="ID_745132704" MODIFIED="1738380670378" TEXT="Ergebnis (Syntax) nur per Referenz rausgeben"/>
<node CREATED="1738380675718" ID="ID_1128902694" MODIFIED="1738380689333" TEXT="wird dann ja in eine gr&#xf6;&#xdf;ere Syntax hinein kopiert"/>
</node>
<node COLOR="#338800" CREATED="1738383217942" ID="ID_1365465597" MODIFIED="1738383232268" TEXT="direkt im Model-Binding das ArgModel populieren">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#4ad37e" COLOR="#395e76" CREATED="1738383260647" ID="ID_518798200" MODIFIED="1738383457363" TEXT="WOW WOW WOW">
<icon BUILTIN="ksmiletris"/>
<icon BUILTIN="ksmiletris"/>
<node CREATED="1738383281669" ID="ID_586712898" MODIFIED="1738383485792">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
da schreibt man so eine <font size="5">Monster-Syntax</font>&#160;einfach hin
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#dee8ae" COLOR="#116b3a" CREATED="1738383295667" ID="ID_1926681347" MODIFIED="1738383374590" STYLE="fork">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
und der Parser funktioniert <font size="6">auf Anhieb</font>
</p>
</body>
</html>
</richcontent>
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<font NAME="SansSerif" SIZE="16"/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
</node>
</node>
@ -105595,8 +105646,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
Ja, es w&#252;rde definitiv gehen, und der User w&#252;rde fluchen, denn die allgegenw&#228;rtigen Quotes haben die N&#252;tzlichkeit einer &#187;einfachen Listen-Spec&#171; wieder auf. Hinzu kommt, da&#223; es einige spziell l&#228;stige Grenzf&#228;lle gibt, wie nested-Quotes , die man dann finden und escapen mu&#223;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738281900077" ID="ID_285802042" MODIFIED="1738282063851" TEXT="bin besorgt wegen der noch offenen Richtung der Entwicklung">
<richcontent TYPE="NOTE"><html>
@ -105606,8 +105656,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
wei&#223; noch nicht recht, wohin das mit der Node-Spec noch f&#252;hren wird; nach der L&#246;sung mit einer textuellen Spech habe ich vor allem gegriffen, da ich eine Festlegung auf ein Meta-Modell vermeiden m&#246;chte &#8212; da noch auf lange Zeit das Projekt nicht im Stande sein wird, das Feld der M&#246;glichkeiten hier zu &#252;berblicken (was f&#252;r Medien werden &#252;berhaupt verarbeitet? Au&#223;er Video und Sound, meine ich....)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1738280786811" ID="ID_1355841919" MODIFIED="1738280796189" TEXT="also dann doch richtig parsen">
@ -105619,8 +105668,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
....und jetzt hab ich einen echten LL-Parser, der diese Aufgabe direkt und ohne Implementierungstricks handhaben kann
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738281326205" ID="ID_1746479195" MODIFIED="1738281816880" TEXT="per Parse kann man aber auch gleich ein Modell erzeugen">
<node CREATED="1738281820274" ID="ID_1616091691" MODIFIED="1738281831902" TEXT="ist die Frage ob das hier sinnvoll ist"/>
@ -105642,8 +105690,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
...deshalb habe ich ja auch die Node-Connectivity beibehalten (obwohl zum Rendern nur die Port-Connectivity gebraucht wird). Zus&#228;tzlich k&#246;nnten noch Attribute in der ProcID eine Rolle spielen. Also insgesamt ehr kein separates Parsing
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1738288408915" ID="ID_1594772328" MODIFIED="1738288439248">
@ -105654,8 +105701,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
&#10233; also so implementieren wie's <i>am einfachsten</i>&#160;geht
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1736633780461" ID="ID_182647940" MODIFIED="1736633788547" TEXT="Repetitions-Spec /#"/>
@ -105694,8 +105740,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
Aua, dieses Thema ist zu lange liegen geblieben; drei Monate sp&#228;ter wei&#223; ich nicht mehr, was ich &#252;berhaupt bezwecken wollte....&#160;&#160;Kam das mit der Pipeline so zustande, weil ich mir vorgestllt hatte, einen Spec-String mit einer RegExp zu &#187;scannen&#171; &#8212; denn so einfach wird es nicht sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1738288462715" ID="ID_721467849" MODIFIED="1738288475560" TEXT="sehe jetzt (1/25) keine direkte Notwendigkeit"/>
<node CREATED="1738288476858" ID="ID_1430760953" MODIFIED="1738288501992" TEXT="und aus einem tempor&#xe4;r erzeugten Proc-Argument-Model lie&#xdf;e sich sowas leicht erzeugen"/>
</node>
@ -106677,7 +106722,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1719880204169" ID="ID_826687521" MODIFIED="1720538363696" TEXT="Diskussion / offene Fragen">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1720537748722" HGAP="86" ID="ID_155032865" MODIFIED="1733426613642" STYLE="bubble" TEXT="es ist kein filligranes Protokoll notwendig" VSHIFT="9">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1720537748722" HGAP="55" ID="ID_155032865" MODIFIED="1733426613642" STYLE="bubble" TEXT="es ist kein filligranes Protokoll notwendig" VSHIFT="62">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -106718,6 +106763,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1738381699283" ID="ID_1808793696" MODIFIED="1738381812146" TEXT="inh&#xe4;rente Struktur-Beschr&#xe4;nkungen des Allocation-Cluster">
<arrowlink COLOR="#fe4663" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="-862;38;" ID="Arrow_ID_778302658" STARTARROW="None" STARTINCLINATION="-918;43;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1719881279352" ID="ID_1378956447" MODIFIED="1719881489034" TEXT="Re-Entrance f&#xfc;r Buffer-Lebenszyklus-Schritte?">
<richcontent TYPE="NOTE"><html>
@ -107279,6 +107328,29 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1738381415480" ID="ID_1812789341" MODIFIED="1738381448206" TEXT="sp&#xe4;ter zu kl&#xe4;ren: Kachel-Gr&#xf6;&#xdf;e f&#xfc;r den Basis-Allokator">
<icon BUILTIN="hourglass"/>
<node CREATED="1738381450309" ID="ID_383140026" MODIFIED="1738381457968" TEXT="schwierige Abw&#xe4;gung"/>
<node BACKGROUND_COLOR="#e5d26f" COLOR="#b9085c" CREATED="1738381458436" ID="ID_705308332" MODIFIED="1738381491213" TEXT="sie stellt tats&#xe4;chlich ein erhebliches Limit dar">
<icon BUILTIN="clanbomber"/>
<node CREATED="1738381499662" ID="ID_583260551" MODIFIED="1738381510369" TEXT="f&#xfc;r das dynamische Wachstum von Vectoren"/>
<node BACKGROUND_COLOR="#e9a695" COLOR="#a50125" CREATED="1738381511432" ID="ID_53988543" MODIFIED="1738381635805" TEXT="f&#xfc;r die Maximal-Zahl eines lib::Several">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
weil dies auf einem Array beruht, also im Speicher kompakt liegen mu&#223;
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#f20033" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="243;-7;" ID="Arrow_ID_1622467293" STARTARROW="None" STARTINCLINATION="153;154;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1715790315814" ID="ID_878890004" MODIFIED="1716659839834" TEXT="L&#xf6;sung f&#xfc;r die Destruktoren schaffen">
<linktarget COLOR="#57a3af" DESTINATION="ID_878890004" ENDARROW="Default" ENDINCLINATION="-446;33;" ID="Arrow_ID_464677545" SOURCE="ID_412040509" STARTARROW="None" STARTINCLINATION="-568;-24;"/>
@ -107465,6 +107537,12 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<linktarget COLOR="#e80a24" DESTINATION="ID_824702678" ENDARROW="Default" ENDINCLINATION="-204;-719;" ID="Arrow_ID_1436781934" SOURCE="ID_1805821863" STARTARROW="None" STARTINCLINATION="-267;13;"/>
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1738381598307" ID="ID_1142487945" MODIFIED="1738381906605" TEXT="kommen wir mit der Kachel-Beschr&#xe4;nkung im Basis-Allokator klar?">
<linktarget COLOR="#f20033" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="243;-7;" ID="Arrow_ID_1622467293" SOURCE="ID_53988543" STARTARROW="None" STARTINCLINATION="153;154;"/>
<linktarget COLOR="#fe4663" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="-862;38;" ID="Arrow_ID_778302658" SOURCE="ID_1808793696" STARTARROW="None" STARTINCLINATION="-918;43;"/>
<linktarget COLOR="#fe4663" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="-609;26;" ID="Arrow_ID_1973425820" SOURCE="ID_333614315" STARTARROW="None" STARTINCLINATION="174;8;"/>
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
@ -107635,6 +107713,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<arrowlink COLOR="#5954b6" DESTINATION="ID_320473769" ENDARROW="Default" ENDINCLINATION="-1037;63;" ID="Arrow_ID_34332665" STARTARROW="None" STARTINCLINATION="-1213;-50;"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1738381699283" ID="ID_333614315" MODIFIED="1738381906605" TEXT="Parametrisierung des Allocation-Cluster (schwierige Abw&#xe4;gung)">
<arrowlink COLOR="#fe4663" DESTINATION="ID_1142487945" ENDARROW="Default" ENDINCLINATION="-609;26;" ID="Arrow_ID_1973425820" STARTARROW="None" STARTINCLINATION="174;8;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node CREATED="1683762860166" ID="ID_1202392530" MODIFIED="1683762863249" TEXT="Konzepte">