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)