Token folding

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 5dca3d01f5
commit dae845d57f

View File

@@ -11,10 +11,6 @@ import print
{.experimental: "caseStmtMacros".}
type
ParsePosition = tuple
column, line, currentLine: int
atNewLine: bool
ParseError = tuple
unexpected: string
expected: seq[string]
@@ -31,9 +27,13 @@ type
Parser* = ref object
state: ParserState
tokens: seq[Token]
ParserResult* = Result[Parser, (Parser, string)]
# Builder[T]* = ref object
# parser: ParserResult,
# tree: seq[T],
# BuilderResult* = Result[Builder, (Builder, string)]
func getOrElse*[T, E](self: Result[T, E], otherwise: T): T =
if self.isOk():
self.v
@@ -114,6 +114,26 @@ func str(s: string): (Parser -> ParserResult) {.inline.} =
p = p.flatMap(ch(c))
return p
# proc foldTokens[T](
# parserResult: ParserResult,
# builderResult: BuilderResult[T],
# fn: Parser -> T,
# ): BuilderResult[T] =
# builderResult.flatMap((b: Builder) => Builder(
# parser: parserResult,
# tree: parserResul
# ))
proc foldTokens[T](
parserResult: ParserResult,
onError: T,
onSuccess: seq[Token] -> T,
): T =
if parserResult.isOk():
onSuccess(parserResult.unsafeGet().tokens)
else:
onError
# onError(parserResult.error)
when isMainModule:
let fooParser = initParser("FOO_BAR")
@@ -124,5 +144,9 @@ when isMainModule:
ch('A'),
ch('R'),
])
.foldTokens(
"Error",
xs => xs.foldl(a & b.value, "")
)
echo fooParser