Move parser into packages/parser

This commit is contained in:
Richard Feldman 2021-04-29 19:23:42 -04:00
parent d055a0e659
commit 62479150ba
5 changed files with 134 additions and 0 deletions

View file

@ -0,0 +1,39 @@
##
##
## Parse an [IPv4](https://en.wikipedia.org/wiki/IPv4) address:
##
## parser : Parser Ip4
## parser =
## a <- keep u8
## _ <- skip (usv '.')
## b <- keep u8
## _ <- skip (usv '.')
## c <- keep u8
## _ <- skip (usv '.')
## d <- keep u8
##
## Parser.succeed (Ip4.fromOctets a b c d)
interface Parser
exposes [ Parser ]
imports []
Parser a :
[
@Parser (Bytes -> Result { answer : a, rest : Bytes } RawProblem)
]
RawProblem : [ ... ]
keep : Parser a, (a -> Parser b) -> Parser b
skip : Parser *, ({} -> Parser b) -> Parser b
str : Parser Str
u8 : Parser U8
u8 = @Parser Str.parseU8 # TODO doesn't work for bytes!
# TODO do we need a separate parser for Str vs Bytes because of encoding? e.g. Parser.Bytes.utf8
i8 : Parser I8

View file

@ -0,0 +1,72 @@
##
##
## Parse an [IPv4](https://en.wikipedia.org/wiki/IPv4) address:
##
## parser : Parser Ip4
## parser =
## a <- keep u8
## _ <- skip (usv '.')
## b <- keep u8
## _ <- skip (usv '.')
## c <- keep u8
## _ <- skip (usv '.')
## d <- keep u8
##
## Parser.succeed (Ip4.fromOctets a b c d)
interface Parser
exposes [ Parser ]
imports []
Parser a :
[
@Parser (Str -> Result { answer : a, rest : Str } RawProblem),
]
RawProblem :
[
Expected
[
NumU8,
NumI8,
NumU16,
NumI16,
NumU32,
NumI32,
NumU64,
NumI64,
NumU128,
NumI128,
NumF64,
NumF32,
End
]
]
keep : Parser a, (a -> Parser b) -> Parser b
skip : Parser *, ({} -> Parser b) -> Parser b
symbol : Str -> Parser {}
symbol = \symbol -> @Parser Str.chompStr symbol
u8 : Parser U8
u8 = @Parser Str.parseU8
i8 : Parser I8
i8 = @Parser Str.parseI8
end : Parser {}
end = @Parser \str ->
if Str.isEmpty str then
Ok {}
else
Err (Expected End)
lazy : ({} -> Parser a) -> Parser a
lazy = \thunk ->
@Parser \str ->
@Parser parse = thunk {}
parse str