Token folding
This commit is contained in:
34
src/test.nim
34
src/test.nim
@@ -11,10 +11,6 @@ import print
|
|||||||
{.experimental: "caseStmtMacros".}
|
{.experimental: "caseStmtMacros".}
|
||||||
|
|
||||||
type
|
type
|
||||||
ParsePosition = tuple
|
|
||||||
column, line, currentLine: int
|
|
||||||
atNewLine: bool
|
|
||||||
|
|
||||||
ParseError = tuple
|
ParseError = tuple
|
||||||
unexpected: string
|
unexpected: string
|
||||||
expected: seq[string]
|
expected: seq[string]
|
||||||
@@ -31,9 +27,13 @@ type
|
|||||||
Parser* = ref object
|
Parser* = ref object
|
||||||
state: ParserState
|
state: ParserState
|
||||||
tokens: seq[Token]
|
tokens: seq[Token]
|
||||||
|
|
||||||
ParserResult* = Result[Parser, (Parser, string)]
|
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 =
|
func getOrElse*[T, E](self: Result[T, E], otherwise: T): T =
|
||||||
if self.isOk():
|
if self.isOk():
|
||||||
self.v
|
self.v
|
||||||
@@ -114,6 +114,26 @@ func str(s: string): (Parser -> ParserResult) {.inline.} =
|
|||||||
p = p.flatMap(ch(c))
|
p = p.flatMap(ch(c))
|
||||||
return p
|
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:
|
when isMainModule:
|
||||||
let fooParser = initParser("FOO_BAR")
|
let fooParser = initParser("FOO_BAR")
|
||||||
@@ -124,5 +144,9 @@ when isMainModule:
|
|||||||
ch('A'),
|
ch('A'),
|
||||||
ch('R'),
|
ch('R'),
|
||||||
])
|
])
|
||||||
|
.foldTokens(
|
||||||
|
"Error",
|
||||||
|
xs => xs.foldl(a & b.value, "")
|
||||||
|
)
|
||||||
|
|
||||||
echo fooParser
|
echo fooParser
|
||||||
|
|||||||
Reference in New Issue
Block a user