@@ -146,13 +146,13 @@ A parser that expects a given token, followed by `p`:
146
146
A parser that expects a particular token :
147
147
148
148
> expect : (t : Token) -> Parser ()
149
- > expect t = firstExpect t (\ xs => SomeE (() , xs))
149
+ > expect t = firstExpect t (\ xs => SomeE (() , xs))
150
150
151
151
==== A Recursive - Descent Parser for Imp
152
152
153
153
Identifiers :
154
154
155
- > parseIdentifier : ( xs : List Token) -> OptionE (Id, List Token)
155
+ > parseIdentifier : Parser Id
156
156
> parseIdentifier [] = NoneE " Expected identifier"
157
157
> parseIdentifier (x:: xs') =
158
158
> if all isLowerAlpha (unpack x)
@@ -161,7 +161,7 @@ Identifiers:
161
161
162
162
Numbers :
163
163
164
- > parseNumber : ( xs : List Token) -> OptionE ( Nat , List Token)
164
+ > parseNumber : Parser Nat
165
165
> parseNumber [] = NoneE " Expected number"
166
166
> parseNumber (x:: xs') =
167
167
> if all isDigit (unpack x)
@@ -171,7 +171,7 @@ Numbers:
171
171
Parse arithmetic expressions
172
172
173
173
> mutual
174
- > parsePrimaryExp : (steps : Nat ) -> ( xs : List Token) -> OptionE ( AExp, List Token)
174
+ > parsePrimaryExp : (steps : Nat ) -> Parser AExp
175
175
> parsePrimaryExp Z _ = NoneE " Too many recursive calls"
176
176
> parsePrimaryExp (S steps') xs =
177
177
> (do (i, rest) <- parseIdentifier xs
@@ -184,14 +184,14 @@ Parse arithmetic expressions
184
184
> (u, rest') <- expect " )" rest
185
185
> pure (e, rest'))
186
186
>
187
- > parseProductExp : (steps : Nat ) -> ( xs : List Token) -> OptionE ( AExp, List Token)
187
+ > parseProductExp : (steps : Nat ) -> Parser AExp
188
188
> parseProductExp Z _ = NoneE " Too many recursive calls"
189
189
> parseProductExp (S steps') xs =
190
190
> do (e, rest) <- parsePrimaryExp steps' xs
191
191
> (es, rest') <- many (firstExpect " *" (parsePrimaryExp steps')) steps' rest
192
192
> pure (foldl AMult e es, rest')
193
193
>
194
- > parseSumExp : (steps : Nat ) -> ( xs : List Token) -> OptionE ( AExp, List Token)
194
+ > parseSumExp : (steps : Nat ) -> Parser AExp
195
195
> parseSumExp Z _ = NoneE " Too many recursive calls"
196
196
> parseSumExp (S steps') xs =
197
197
> do (e, rest) <- parseProductExp steps' xs
@@ -211,61 +211,48 @@ Parse arithmetic expressions
211
211
> (do (e, r) <- firstExpect " -" p xs
212
212
> pure ((False , e), r))
213
213
>
214
- > parseAExp : (steps : Nat ) -> ( xs : List Token) -> OptionE ( AExp, List Token)
214
+ > parseAExp : (steps : Nat ) -> Parser AExp
215
215
> parseAExp = parseSumExp
216
216
217
217
Parsing boolean expressions :
218
218
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
268
254
255
+ `` coq
269
256
Check parseConjunctionExp.
270
257
271
258
Definition testParsing {X : Type }
0 commit comments