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:
parent
bd70c5faec
commit
5c2b6b69f6
4 changed files with 232 additions and 76 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -105319,8 +105319,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
ich war blockiert mit dem testgetriebenen Ansatz, denn ich kann zwar jetzt Nodes bauen, aber nicht einfach verifizieren und dokumentieren, daß sie korrekt verdrahtet sind.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1738288616423" ID="ID_1286145380" MODIFIED="1738288759369" TEXT="in Ergänzung wird damit Diagnose-Funktionalität aufgebaut">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -105330,8 +105329,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
die gleiche Funktionalität wird später zur Problem-Diagnose benö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 (⟼ Cache-Key)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -105341,8 +105339,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
im Moment sieht's so aus, daß der erzeugende Code im Library-Plug-In ohnehin von internen strukturierten Daten ausgeht, um daraus die Node-Spec <i>zu generieren.</i> Diese wird dann einmal beim Builde per Parse zerlegt und ggfs noch zusä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<R1> b1, Extension<R1,R2> extension)
|
|||
⟹ alle <i>Deklarationen</i> 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<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> extension)
|
|||
d.h. ArgumentModel könnte eine Struct sein, und lediglich zusä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 ⟹ nachrüsten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -105531,8 +105527,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
...muß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<R1> b1, Extension<R1,R2> extension)
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1738364976050" ID="ID_192401035" MODIFIED="1738364993580" TEXT="damit jetzt nutzbar fü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ßerdem: Builder-Funktion für <geklammerte sub-Spec>">
|
||||
<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öß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> 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<R1> b1, Extension<R1,R2> extension)
|
|||
Ja, es würde definitiv gehen, und der User würde fluchen, denn die allgegenwärtigen Quotes haben die Nützlichkeit einer »einfachen Listen-Spec« wieder auf. Hinzu kommt, daß es einige spziell lästige Grenzfälle gibt, wie nested-Quotes , die man dann finden und escapen muß
|
||||
</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<R1> b1, Extension<R1,R2> extension)
|
|||
weiß noch nicht recht, wohin das mit der Node-Spec noch führen wird; nach der Lösung mit einer textuellen Spech habe ich vor allem gegriffen, da ich eine Festlegung auf ein Meta-Modell vermeiden möchte — da noch auf lange Zeit das Projekt nicht im Stande sein wird, das Feld der Möglichkeiten hier zu überblicken (was für Medien werden überhaupt verarbeitet? Auß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<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> extension)
|
|||
...deshalb habe ich ja auch die Node-Connectivity beibehalten (obwohl zum Rendern nur die Port-Connectivity gebraucht wird). Zusätzlich kö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<R1> b1, Extension<R1,R2> extension)
|
|||
⟹ also so implementieren wie's <i>am einfachsten</i> 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<R1> b1, Extension<R1,R2> extension)
|
|||
Aua, dieses Thema ist zu lange liegen geblieben; drei Monate später weiß ich nicht mehr, was ich überhaupt bezwecken wollte....  Kam das mit der Pipeline so zustande, weil ich mir vorgestllt hatte, einen Spec-String mit einer RegExp zu »scannen« — 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är erzeugten Proc-Argument-Model ließe sich sowas leicht erzeugen"/>
|
||||
</node>
|
||||
|
|
@ -106677,7 +106722,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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ärente Struktur-Beschrä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ür Buffer-Lebenszyklus-Schritte?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -107279,6 +107328,29 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1738381415480" ID="ID_1812789341" MODIFIED="1738381448206" TEXT="später zu klären: Kachel-Größe für den Basis-Allokator">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node CREATED="1738381450309" ID="ID_383140026" MODIFIED="1738381457968" TEXT="schwierige Abwägung"/>
|
||||
<node BACKGROUND_COLOR="#e5d26f" COLOR="#b9085c" CREATED="1738381458436" ID="ID_705308332" MODIFIED="1738381491213" TEXT="sie stellt tatsächlich ein erhebliches Limit dar">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
<node CREATED="1738381499662" ID="ID_583260551" MODIFIED="1738381510369" TEXT="für das dynamische Wachstum von Vectoren"/>
|
||||
<node BACKGROUND_COLOR="#e9a695" COLOR="#a50125" CREATED="1738381511432" ID="ID_53988543" MODIFIED="1738381635805" TEXT="fü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ß
|
||||
</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ösung fü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<R1> b1, Extension<R1,R2> 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ä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<R1> b1, Extension<R1,R2> 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ä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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue