WIP Working seq parsing

This commit is contained in:
Florian Schroedl
2022-06-17 18:44:42 +02:00
parent 832cfe6a06
commit de0382e812
2 changed files with 107 additions and 17 deletions

View File

@@ -49,6 +49,7 @@ let parseHeadingText = @[
# # builder.level = token.tokenStringValue().len
# token
let buildStars = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.}=
org.level = tokens.len
org
@@ -101,31 +102,53 @@ let headingParser = choice(@[
endOfStream,
])
let newlineParser: seq[Parser -> ParserResult] = @[newline + newline]
let buildNewline = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.} =
OrgBlock(
kind: orgNewline
)
proc concatOrgBlock(xs: seq[OrgBlock], ys: seq[OrgBlock]): seq[OrgBlock] = xs & ys
let contentParsersSeq: seq[tuple[
parsers: seq[Parser -> ParserResult],
tokenFoldFn: (seq[ParserToken], OrgBlock) -> OrgBlock,
ignoreEmpty: bool,
# concatFn: (seq[OrgBlock], seq[OrgBlock]) -> seq[OrgBlock],
]] = @[
(newlineParser, buildNewline, false),
# (newlineParser, buildNewline, false),
]
proc parseHeadlineChildren(builder: OrgBuilder): OrgBuilderResult =
var headingBlock = builder.tree[0]
var parserAcc: ParserResult = ParserResult.ok(builder.parser)
var builderAcc: OrgBuilderResult = OrgBuilderResult.ok(builder)
# echo parserAcc
while builderAcc.isOk() and builderAcc.tryParser(headingParser).isErr():
builderAcc = builderAcc
.applyParsersSeqToSeq(
contentParsersSeq
)
while parserAcc.isOk() and parserAcc.flatMap(headingParser).isErr():
parserAcc = parserAcc.flatMap(anyCh)
builderAcc
let content = parserAcc.foldTokens(
(err) => "",
(xs: seq[ParserToken]) => xs.tokensToString(),
)
headingBlock.content = content
# let content = builderAcc.fold(
# (_err) => "",
# (builder: OrgBuilder) => builder.tree,
# )
# headingBlock.content = content
let res = parserAcc.fold(
(err) => OrgBuilderResult.err((builder, "Could not parse content")),
(parser: Parser) => OrgBuilderResult.ok((
parser: parser.emptyTokens(),
tree: @[headingBlock],
))
)
# let res = builderAcc.fold(
# (_err) => OrgBuilderResult.err((builder, "Could not parse content")),
# (builder: OrgBuilder) => OrgBuilderResult.ok((
# parser: builder.parser.emptyTokens(),
# tree: @[headingBlock],
# ))
# )
res
# res
proc makeOrg*(x: string): OrgBuilderResult =
var acc = initOrgBuilder(x)

View File

@@ -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