diff --git a/src/parser/parser.nim b/src/parser/parser.nim index 10dc27d..8de9272 100644 --- a/src/parser/parser.nim +++ b/src/parser/parser.nim @@ -194,6 +194,11 @@ proc endOfStream*(parser: Parser): ParserResult = parser: parser, )) +proc newline*(parser: Parser): ParserResult = + parser + .endOfStream() + .flatMap(ch(NewLines)) + func ignore*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} = ## Parse characters but throw success tokens away return proc(parser: Parser): ParserResult = @@ -321,18 +326,32 @@ proc foldBuilder*[T, T2]( let err = builderResult.error() onError(err[1]) + when isMainModule: + proc getTokens(x: ParserResult): seq[char] = + x.foldTokens( + proc(err: ParserError): seq[char] = @[], + proc(xs: seq[Token]): seq[char] = xs.map((x: Token) => x.value), + ) + + proc testParser(x: string, ps: seq[Parser -> ParserResult]): seq[char] = + initParserResult(x).parseSeq(ps).getTokens() + let optionalPrefixParser = @[ optional(ch('_')), str("ABC") ] + assert: "_ABC".testParser(optionalPrefixParser) == @['_', 'A', 'B', 'C'] + assert: "ABC".testParser(optionalPrefixParser) == @['A', 'B', 'C'] - echo initParserResult("_ABC").parseSeq(optionalPrefixParser) - echo initParserResult("ABC").parseSeq(optionalPrefixParser) - - let andParsers = @[ + let andParser = @[ (ch('A') + ch('B')), ch('C'), ] + assert: "ABC".testParser(andParser) == @['A', 'B', 'C'] - echo initParserResult("ABC").parseSeq(andParsers) + # let newlineParser = @[ + # str("ABC"), + # newline + # ] + # echo initParserResult("ABC").parseSeq(newLineParser)