mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 15:21:12 +00:00
Move parser into packages/parser
This commit is contained in:
parent
d055a0e659
commit
62479150ba
5 changed files with 134 additions and 0 deletions
39
packages/parser/src/Bytes.Parser.roc
Normal file
39
packages/parser/src/Bytes.Parser.roc
Normal 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
|
72
packages/parser/src/Parser.roc
Normal file
72
packages/parser/src/Parser.roc
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue