Extract properties block parser to file
This commit is contained in:
@@ -33,8 +33,8 @@ type
|
||||
# keyValuePairValue*: parserTokenKeyValuePairValueT
|
||||
|
||||
Parser* = ref object
|
||||
state: ParserState
|
||||
tokens: seq[ParserToken]
|
||||
state*: ParserState
|
||||
tokens*: seq[ParserToken]
|
||||
|
||||
ParseErrorKind = enum
|
||||
choiceMismatchErr
|
||||
@@ -238,6 +238,26 @@ func ignore*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inlin
|
||||
tokens: parser.tokens,
|
||||
))
|
||||
|
||||
|
||||
func flattenParserTokens*(parser: Parser): ParserResult =
|
||||
return ParserResult.ok(
|
||||
Parser(
|
||||
state: parser.state,
|
||||
tokens: @[
|
||||
ParserToken(
|
||||
kind: parserTokenString,
|
||||
stringValue: parser.tokens.foldl(a & b.tokenStringValue(), "")
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
func emptyTokens*(parser: Parser): Parser =
|
||||
Parser(
|
||||
state: parser.state,
|
||||
tokens: newSeq[ParserToken](),
|
||||
)
|
||||
|
||||
func optional*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} =
|
||||
## Parse characters and ignore failure
|
||||
return proc(parser: Parser): ParserResult =
|
||||
@@ -293,8 +313,8 @@ proc `+`*(parserFnA: Parser -> ParserResult, parserFnB: Parser -> ParserResult):
|
||||
|
||||
|
||||
let newlineParser = choice(@[
|
||||
ch(NewLines),
|
||||
endOfStream,
|
||||
ch(NewLines)
|
||||
])
|
||||
proc newline*(parser: Parser): ParserResult = newlineParser(parser)
|
||||
|
||||
|
||||
21
src/parser/utils.nim
Normal file
21
src/parser/utils.nim
Normal file
@@ -0,0 +1,21 @@
|
||||
import std/sugar
|
||||
import std/collections/sequtils
|
||||
import ./parser
|
||||
import results
|
||||
|
||||
type StringBuilderT* = string
|
||||
type StringBuilder* = Builder[StringBuilderT]
|
||||
type StringBuilderResult* = BuilderResult[StringBuilderT]
|
||||
|
||||
proc stringConcat*(typeInfo: StringBuilderT):
|
||||
(seq[ParserToken], seq[StringBuilderT]) -> seq[StringBuilderT] =
|
||||
|
||||
return proc(xs: seq[ParserToken], ys: seq[StringBuilderT]): seq[StringBuilderT] =
|
||||
return ys & xs.foldl(a & b.tokenStringValue(), typeInfo)
|
||||
|
||||
proc initStringBuilder*(str: string): StringBuilderResult =
|
||||
StringBuilderResult
|
||||
.ok(StringBuilder((
|
||||
parser: initParser(str),
|
||||
tree: newSeq[StringBuilderT](),
|
||||
)))
|
||||
Reference in New Issue
Block a user