WIP Working seq parsing
This commit is contained in:
@@ -199,6 +199,38 @@ proc applyParsersToSingle*[T](
|
||||
)
|
||||
)
|
||||
|
||||
## TODO Implement applyParsersSeqToSingle with this function by forming the concatFn
|
||||
proc applyParsersToSeq*[T](
|
||||
builder: Builder[T],
|
||||
parsers: seq[Parser -> ParserResult],
|
||||
tokenFoldFn: (seq[ParserToken], T) -> T,
|
||||
# concatFn = `&`,
|
||||
optional = false,
|
||||
isFirst: bool,
|
||||
): BuilderResult[T] =
|
||||
# Apply the current parsing functions and convert to text tokens wrapped in ParserResult
|
||||
let newParser = ParserResult.ok(Parser(
|
||||
state: builder[0].state,
|
||||
tokens: @[]
|
||||
))
|
||||
.parseSeq(parsers)
|
||||
|
||||
newParser
|
||||
.foldTokens(
|
||||
(err: ParserError) => BuilderResult[T].err((builder, "foo")),
|
||||
(newTokens: seq[ParserToken]) => (
|
||||
if optional and newTokens.len == 0:
|
||||
BuilderResult[T].ok(builder)
|
||||
else:
|
||||
BuilderResult[T].ok(
|
||||
builder.initBuilder(
|
||||
newParser.unsafeGet(),
|
||||
builder.tree & builder.tree
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
proc applyParsersSeqToSingle*[T](
|
||||
builderResult: BuilderResult[T],
|
||||
initT: T,
|
||||
@@ -220,6 +252,27 @@ proc applyParsersSeqToSingle*[T](
|
||||
builderResult
|
||||
)
|
||||
|
||||
proc applyParsersSeqToSeq*[T](
|
||||
builderResult: BuilderResult[T],
|
||||
xs: seq[tuple[
|
||||
parsers: seq[Parser -> ParserResult],
|
||||
tokenFoldFn: (seq[ParserToken], T) -> T,
|
||||
ignoreEmpty: bool,
|
||||
# concatFn: (seq[T], seq[T]) -> seq[T],
|
||||
]],
|
||||
): BuilderResult[T] =
|
||||
xs.foldl(
|
||||
a.flatMap((builder: Builder[T]) => applyParsersToSeq(
|
||||
builder = builder,
|
||||
parsers = b.parsers,
|
||||
tokenFoldFn = b.tokenFoldFn,
|
||||
optional = b.ignoreEmpty,
|
||||
isFirst = a == builderResult,
|
||||
# concatFn = concatFn
|
||||
)),
|
||||
builderResult
|
||||
)
|
||||
|
||||
proc applyParsers*[T](
|
||||
builder: Builder[T],
|
||||
parsers: seq[Parser -> ParserResult],
|
||||
@@ -260,6 +313,20 @@ proc foldBuilder*[T, T2](
|
||||
let err = builderResult.error()
|
||||
onError(err[1])
|
||||
|
||||
# proc parseBuildOr*[T](
|
||||
# ## Checks
|
||||
# builderResult: BuilderResult[T],
|
||||
# builders: seq[tuple[
|
||||
# parsers: seq[Parser -> ParserResult],
|
||||
# tokenFoldFn: (seq[ParserToken], T) -> T,
|
||||
# ]],
|
||||
# defaultBuilder: tuple[
|
||||
# defaultParser: Parser -> ParserResult,
|
||||
# defaultFoldFn: (seq[ParserToken], T) -> T,
|
||||
# ],
|
||||
# until:
|
||||
# ): BuilderResult[T] =
|
||||
|
||||
|
||||
# -- Stringifiers
|
||||
|
||||
|
||||
Reference in New Issue
Block a user