Skip to content

Commit a31d1e3

Browse files
author
Alex Gryzlov
committed
boolean parser
1 parent 3d0ca4e commit a31d1e3

File tree

1 file changed

+43
-56
lines changed

1 file changed

+43
-56
lines changed

src/ImpParser.lidr

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ A parser that expects a given token, followed by `p`:
146146
A parser that expects a particular token:
147147

148148
> expect : (t : Token) -> Parser ()
149-
> expect t = firstExpect t (\xs => SomeE((), xs))
149+
> expect t = firstExpect t (\xs => SomeE ((), xs))
150150

151151
==== A Recursive-Descent Parser for Imp
152152

153153
Identifiers:
154154

155-
> parseIdentifier : (xs : List Token) -> OptionE (Id, List Token)
155+
> parseIdentifier : Parser Id
156156
> parseIdentifier [] = NoneE "Expected identifier"
157157
> parseIdentifier (x::xs') =
158158
> if all isLowerAlpha (unpack x)
@@ -161,7 +161,7 @@ Identifiers:
161161

162162
Numbers:
163163

164-
> parseNumber : (xs : List Token) -> OptionE (Nat, List Token)
164+
> parseNumber : Parser Nat
165165
> parseNumber [] = NoneE "Expected number"
166166
> parseNumber (x::xs') =
167167
> if all isDigit (unpack x)
@@ -171,7 +171,7 @@ Numbers:
171171
Parse arithmetic expressions
172172

173173
> mutual
174-
> parsePrimaryExp : (steps : Nat) -> (xs : List Token) -> OptionE (AExp, List Token)
174+
> parsePrimaryExp : (steps : Nat) -> Parser AExp
175175
> parsePrimaryExp Z _ = NoneE "Too many recursive calls"
176176
> parsePrimaryExp (S steps') xs =
177177
> (do (i, rest) <- parseIdentifier xs
@@ -184,14 +184,14 @@ Parse arithmetic expressions
184184
> (u, rest') <- expect ")" rest
185185
> pure (e, rest'))
186186
>
187-
> parseProductExp : (steps : Nat) -> (xs : List Token) -> OptionE (AExp, List Token)
187+
> parseProductExp : (steps : Nat) -> Parser AExp
188188
> parseProductExp Z _ = NoneE "Too many recursive calls"
189189
> parseProductExp (S steps') xs =
190190
> do (e, rest) <- parsePrimaryExp steps' xs
191191
> (es, rest') <- many (firstExpect "*" (parsePrimaryExp steps')) steps' rest
192192
> pure (foldl AMult e es, rest')
193193
>
194-
> parseSumExp : (steps : Nat) -> (xs : List Token) -> OptionE (AExp, List Token)
194+
> parseSumExp : (steps : Nat) -> Parser AExp
195195
> parseSumExp Z _ = NoneE "Too many recursive calls"
196196
> parseSumExp (S steps') xs =
197197
> do (e, rest) <- parseProductExp steps' xs
@@ -211,61 +211,48 @@ Parse arithmetic expressions
211211
> (do (e, r) <- firstExpect "-" p xs
212212
> pure ((False, e), r))
213213
>
214-
> parseAExp : (steps : Nat) -> (xs : List Token) -> OptionE (AExp, List Token)
214+
> parseAExp : (steps : Nat) -> Parser AExp
215215
> parseAExp = parseSumExp
216216

217217
Parsing boolean expressions:
218218

219-
```coq
220-
Fixpoint parseAtomicExp (steps:nat)
221-
(xs : list token) :=
222-
match steps with
223-
| 0 => NoneE "Too many recursive calls"
224-
| S steps' =>
225-
DO (u,rest) <-- expect "true" xs;
226-
SomeE (BTrue,rest)
227-
OR DO (u,rest) <-- expect "false" xs;
228-
SomeE (BFalse,rest)
229-
OR DO (e,rest) <--
230-
firstExpect "not"
231-
(parseAtomicExp steps')
232-
xs;
233-
SomeE (BNot e, rest)
234-
OR DO (e,rest) <--
235-
firstExpect "("
236-
(parseConjunctionExp steps') xs;
237-
(DO (u,rest') <== expect ")" rest;
238-
SomeE (e, rest'))
239-
OR DO (e, rest) <== parseProductExp steps' xs;
240-
(DO (e', rest') <--
241-
firstExpect "=="
242-
(parseAExp steps') rest;
243-
SomeE (BEq e e', rest')
244-
OR DO (e', rest') <--
245-
firstExpect "<="
246-
(parseAExp steps') rest;
247-
SomeE (BLe e e', rest')
248-
OR
249-
NoneE
250-
"Expected '==' or '<=' after arithmetic expression")
251-
end
252-
253-
with parseConjunctionExp (steps:nat)
254-
(xs : list token) :=
255-
match steps with
256-
| 0 => NoneE "Too many recursive calls"
257-
| S steps' =>
258-
DO (e, rest) <==
259-
parseAtomicExp steps' xs ;
260-
DO (es, rest') <==
261-
many (firstExpect "&&"
262-
(parseAtomicExp steps'))
263-
steps' rest;
264-
SomeE (fold_left BAnd es e, rest')
265-
end.
266-
267-
Definition parseBExp := parseConjunctionExp.
219+
> mutual
220+
> parseAtomicExp : (steps : Nat) -> Parser BExp
221+
> parseAtomicExp Z _ = NoneE "Too many recursive calls"
222+
> parseAtomicExp (S steps') xs =
223+
> (do (u, rest) <- expect "true" xs
224+
> pure (BTrue, rest))
225+
> <|>
226+
> (do (u, rest) <- expect "false" xs
227+
> pure (BFalse, rest))
228+
> <|>
229+
> (do (e, rest) <- firstExpect "not" (parseAtomicExp steps') xs
230+
> pure (BNot e, rest))
231+
> <|>
232+
> (do (e, rest) <- firstExpect "(" (parseConjunctionExp steps') xs
233+
> (u, rest') <- expect ")" rest
234+
> pure (e, rest'))
235+
> <|>
236+
> (do (e, rest) <- parseProductExp steps' xs
237+
> ((do (e', rest') <- firstExpect "==" (parseAExp steps') rest
238+
> pure (BEq e e', rest'))
239+
> <|>
240+
> (do (e', rest') <- firstExpect "<=" (parseAExp steps') rest
241+
> pure (BLe e e', rest'))
242+
> <|>
243+
> (NoneE "Expected '==' or '<=' after arithmetic expression")))
244+
>
245+
> parseConjunctionExp : (steps : Nat) -> Parser BExp
246+
> parseConjunctionExp Z _ = NoneE "Too many recursive calls"
247+
> parseConjunctionExp (S steps') xs =
248+
> do (e, rest) <- parseAtomicExp steps' xs
249+
> (es, rest') <- many (firstExpect "&&" (parseAtomicExp steps')) steps' rest
250+
> pure (foldl BAnd e es, rest')
251+
>
252+
> parseBExp : (steps : Nat) -> Parser BExp
253+
> parseBExp = parseConjunctionExp
268254

255+
``coq
269256
Check parseConjunctionExp.
270257

271258
Definition testParsing {X : Type}

0 commit comments

Comments
 (0)