Skip to content

Commit c7373b2

Browse files
duvenaudaxch
authored andcommitted
Add some more parser combinators and a split function.
1 parent 568e937 commit c7373b2

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

lib/parser.dx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ def parse_any() ->> Parser Char = MkParser \h.
7171
h.offset := i + 1
7272
c'
7373

74+
def parse_anything_but(c:Char) -> Parser Char =
75+
MkParser \h.
76+
i = get h.offset
77+
c' = index_list h.input i
78+
assert (c /= c')
79+
h.offset := i + 1
80+
c'
81+
7482
def try(parser:Parser a) -> Parser a given (a) = MkParser \h.
7583
savedPos = get h.offset
7684
ans = catch \. parse h parser
@@ -101,6 +109,12 @@ def parse_many(parser:Parser a) -> Parser (List a) given (a|Data) = MkParser \h.
101109
push results x
102110
Continue
103111

112+
def parse_some(parser:Parser a) -> Parser (List a) given (a|Data) =
113+
MkParser \h.
114+
c = parse h parser
115+
rest = parse h $ parse_many parser
116+
AsList(_, [c]) <> rest
117+
104118
def parse_unsigned_int() ->> Parser Int = MkParser \h.
105119
AsList(_, digits) = parse h $ parse_many parse_digit
106120
yield_state 0 \ref.
@@ -122,3 +136,16 @@ def bracketed(l:Parser (), r:Parser (), body:Parser a) -> Parser a given (a) =
122136

123137
def parens(parser:Parser a) -> Parser a given (a) =
124138
bracketed (p_char '(') (p_char ')') parser
139+
140+
def split(space:Char, s:String) -> List String =
141+
def trailing_spaces(space:Parser (), body:Parser a) -> Parser a given (a) =
142+
MkParser \h.
143+
ans = parse h body
144+
_ = parse h $ parse_many space
145+
ans
146+
split_parser = MkParser \h.
147+
_ = parse h $ parse_many (p_char space)
148+
parse h $ parse_many (trailing_spaces (p_char space) (parse_some (parse_anything_but space)))
149+
case run_parser s split_parser of
150+
Just l -> l
151+
Nothing -> AsList _ []

tests/parser-combinator-tests.dx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,6 @@ def parserTFTriple() ->> Parser (Fin 3=>Bool) = MkParser \h.
5252

5353
:p run_parser "-1389" $ parse_int
5454
> (Just -1389)
55+
56+
split ' ' " This is a sentence. "
57+
> (AsList 4 ["This", "is", "a", "sentence."])

0 commit comments

Comments
 (0)