Token folding
This commit is contained in:
34
src/test.nim
34
src/test.nim
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user