Move delimiter parser to internals
This commit is contained in:
@@ -10,13 +10,6 @@ import ../parser/parser_internals
|
|||||||
import ../parser/parser_types
|
import ../parser/parser_types
|
||||||
import ../parser/builder_api
|
import ../parser/builder_api
|
||||||
|
|
||||||
let parseBetweenDelimiter* = proc(start: (Parser -> ParserResult), stop: (Parser -> ParserResult)): (Parser -> ParserResult) {.closure.} =
|
|
||||||
ignore(start) +
|
|
||||||
anyUntil(stop + whitespace) +
|
|
||||||
ignore(start)
|
|
||||||
|
|
||||||
let parseBetweenPair* = proc(delimiterParser: (Parser -> ParserResult)): (Parser -> ParserResult) {.closure.} =
|
|
||||||
parseBetweenDelimiter(delimiterParser, delimiterParser)
|
|
||||||
|
|
||||||
let boldParser* = parseBetweenPair(ch('*'))
|
let boldParser* = parseBetweenPair(ch('*'))
|
||||||
let italicParser* = parseBetweenPair(ch('/'))
|
let italicParser* = parseBetweenPair(ch('/'))
|
||||||
|
|||||||
@@ -87,8 +87,7 @@ func str*(s: string): (Parser -> ParserResult) {.inline.} =
|
|||||||
p = p.flatMap(ch(c))
|
p = p.flatMap(ch(c))
|
||||||
return p
|
return p
|
||||||
|
|
||||||
|
# -- Parsing API
|
||||||
# -- Parsing Helper Functions
|
|
||||||
|
|
||||||
func optional*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} =
|
func optional*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} =
|
||||||
## Parse characters and ignore failure
|
## Parse characters and ignore failure
|
||||||
@@ -187,33 +186,12 @@ proc whitespace*(parser: Parser): ParserResult =
|
|||||||
whitespaceParser(parser)
|
whitespaceParser(parser)
|
||||||
.mapErr((x: ParserError) => x.setErrorExpectedField("Whitespace"))
|
.mapErr((x: ParserError) => x.setErrorExpectedField("Whitespace"))
|
||||||
|
|
||||||
# when isMainModule:
|
# -- Parsing Helpers
|
||||||
# proc getTokens(x: ParserResult): seq[string] =
|
|
||||||
# x.foldTokens(
|
|
||||||
# proc(err: ParserError): seq[string] =
|
|
||||||
# echo err
|
|
||||||
# @[],
|
|
||||||
# proc(xs: seq[ParserToken]): seq[string] = xs.map((x: ParserToken) => x.tokenStringValue()),
|
|
||||||
# )
|
|
||||||
|
|
||||||
# proc testParser(x: string, ps: seq[Parser -> ParserResult]): seq[string] =
|
let parseBetweenDelimiter* = proc(start: (Parser -> ParserResult), stop: (Parser -> ParserResult)): (Parser -> ParserResult) {.closure.} =
|
||||||
# initParserResult(x).parseSeq(ps).getTokens()
|
ignore(start) +
|
||||||
|
anyUntil(stop + whitespace) +
|
||||||
|
ignore(start)
|
||||||
|
|
||||||
# let optionalPrefixParser = @[
|
let parseBetweenPair* = proc(delimiterParser: (Parser -> ParserResult)): (Parser -> ParserResult) {.closure.} =
|
||||||
# optional(ch('_')),
|
parseBetweenDelimiter(delimiterParser, delimiterParser)
|
||||||
# str("ABC")
|
|
||||||
# ]
|
|
||||||
# assert: "_ABC".testParser(optionalPrefixParser) == @["_", "A", "B", "C"]
|
|
||||||
# assert: "ABC".testParser(optionalPrefixParser) == @["A", "B", "C"]
|
|
||||||
|
|
||||||
# let andParser = @[
|
|
||||||
# (ch('A') + ch('B')),
|
|
||||||
# ch('C'),
|
|
||||||
# ]
|
|
||||||
# assert: "ABC".testParser(andParser) == @["A", "B", "C"]
|
|
||||||
|
|
||||||
# let newlineParserTest = @[
|
|
||||||
# str("ABC"),
|
|
||||||
# newline
|
|
||||||
# ]
|
|
||||||
# assert "ABC\n".testParser(newlineParserTest) == @["A", "B", "C", "\n"]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user