@@ -145,13 +145,6 @@ impl<'src> Expr<'src> {
145
145
}
146
146
}
147
147
148
- fn var ( name : & ' src str ) -> Self {
149
- Self :: Var {
150
- name,
151
- kind : Type :: Unknown ,
152
- }
153
- }
154
-
155
148
fn unary_op ( op : UnaryOps , arg : Box < Spanned < Self > > , interval : Option < Spanned < Interval < ' src > > > ) -> Self {
156
149
let mut arg = arg;
157
150
( * arg) . 0 . make_typed ( op. default_type ( ) ) ;
@@ -189,8 +182,7 @@ type ParserInput<'tokens, 'src> = SpannedInput<Token<'src>, Span, &'tokens [(Tok
189
182
pub fn num_expr_parser < ' tokens , ' src : ' tokens > (
190
183
) -> impl Parser < ' tokens , ParserInput < ' tokens , ' src > , Spanned < Expr < ' src > > , Error < ' tokens , ' src > > + Clone {
191
184
recursive ( |num_expr| {
192
- let var = select ! { Token :: Ident ( ident) => Expr :: Var { name: ident. clone( ) , kind: Type :: default ( ) } }
193
- . labelled ( "variable" ) ;
185
+ let var = select ! { Token :: Ident ( name) => Expr :: Var { name, kind: Type :: default ( ) } } . labelled ( "variable" ) ;
194
186
195
187
let num_literal = select ! {
196
188
Token :: Int ( val) => Expr :: Int ( val) ,
@@ -223,24 +215,32 @@ pub fn num_expr_parser<'tokens, 'src: 'tokens>(
223
215
224
216
// Product ops (multiply and divide) have equal precedence
225
217
let product_op = {
226
- let op = just ( Token :: Times )
227
- . to ( BinaryOps :: Mul )
228
- . or ( just ( Token :: Divide ) . to ( BinaryOps :: Div ) ) ;
229
- neg_op. clone ( ) . foldl ( op. then ( neg_op) . repeated ( ) , |a, ( op, b) | {
230
- let span = a. 1 . start ..b. 1 . end ;
231
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
232
- } )
218
+ let op = choice ( (
219
+ just ( Token :: Times ) . to ( BinaryOps :: Mul ) ,
220
+ just ( Token :: Divide ) . to ( BinaryOps :: Div ) ,
221
+ ) ) ;
222
+ neg_op
223
+ . clone ( )
224
+ . foldl ( op. then ( neg_op) . repeated ( ) , |a, ( op, b) | {
225
+ let span = a. 1 . start ..b. 1 . end ;
226
+ ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
227
+ } )
228
+ . boxed ( )
233
229
} ;
234
230
235
231
// Sum ops (add and subtract) have equal precedence
236
232
let sum_op = {
237
- let op = just ( Token :: Plus )
238
- . to ( BinaryOps :: Add )
239
- . or ( just ( Token :: Minus ) . to ( BinaryOps :: Sub ) ) ;
240
- product_op. clone ( ) . foldl ( op. then ( product_op) . repeated ( ) , |a, ( op, b) | {
241
- let span = a. 1 . start ..b. 1 . end ;
242
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
243
- } )
233
+ let op = choice ( (
234
+ just ( Token :: Plus ) . to ( BinaryOps :: Add ) ,
235
+ just ( Token :: Minus ) . to ( BinaryOps :: Sub ) ,
236
+ ) ) ;
237
+ product_op
238
+ . clone ( )
239
+ . foldl ( op. then ( product_op) . repeated ( ) , |a, ( op, b) | {
240
+ let span = a. 1 . start ..b. 1 . end ;
241
+ ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
242
+ } )
243
+ . boxed ( )
244
244
} ;
245
245
246
246
sum_op. labelled ( "numeric expression" ) . as_context ( )
@@ -272,8 +272,9 @@ pub fn parser<'tokens, 'src: 'tokens>(
272
272
span. into ( ) ,
273
273
)
274
274
} )
275
+ . boxed ( )
275
276
} ;
276
- let num_expr = num_expr_parser ( ) ;
277
+ let num_expr = num_expr_parser ( ) . boxed ( ) ;
277
278
278
279
recursive ( |expr| {
279
280
let literal = select ! {
@@ -284,32 +285,28 @@ pub fn parser<'tokens, 'src: 'tokens>(
284
285
let var = select ! { Token :: Ident ( ident) => Expr :: Var { name: ident. clone( ) , kind: Type :: default ( ) } }
285
286
. labelled ( "variable" ) ;
286
287
287
- // Relational ops (<, <=, >, >=) have equal precedence
288
+ // Relational ops (<, <=, >, >=, ==, != ) have equal precedence
288
289
let relational_op = {
289
- let op = just ( Token :: Lt ) . to ( BinaryOps :: Lt ) . or ( just ( Token :: Le )
290
- . to ( BinaryOps :: Le )
291
- . or ( just ( Token :: Gt ) . to ( BinaryOps :: Gt ) . or ( just ( Token :: Ge ) . to ( BinaryOps :: Ge ) ) ) ) ;
292
- num_expr. clone ( ) . foldl ( op. then ( num_expr) . repeated ( ) , |a, ( op, b) | {
293
- let span = a. 1 . start ..b. 1 . end ;
294
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
295
- } )
296
- } ;
297
-
298
- // Equality ops (==, !=) have equal precedence
299
- let equality_op = {
300
- let op = just ( Token :: Eq )
301
- . to ( BinaryOps :: Eq )
302
- . or ( just ( Token :: Neq ) . to ( BinaryOps :: Neq ) ) ;
303
- relational_op
290
+ let op = choice ( (
291
+ just ( Token :: Lt ) . to ( BinaryOps :: Lt ) ,
292
+ just ( Token :: Le ) . to ( BinaryOps :: Le ) ,
293
+ just ( Token :: Gt ) . to ( BinaryOps :: Gt ) ,
294
+ just ( Token :: Ge ) . to ( BinaryOps :: Ge ) ,
295
+ just ( Token :: Eq ) . to ( BinaryOps :: Eq ) ,
296
+ just ( Token :: Neq ) . to ( BinaryOps :: Neq ) ,
297
+ ) ) ;
298
+ num_expr
304
299
. clone ( )
305
- . foldl ( op. then ( relational_op) . repeated ( ) , |a, ( op, b) | {
300
+ . then ( op. then ( num_expr) )
301
+ . map ( |( a, ( op, b) ) | {
306
302
let span = a. 1 . start ..b. 1 . end ;
307
303
( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
308
304
} )
305
+ . boxed ( )
309
306
}
310
307
. labelled ( "atomic predicate" ) ;
311
308
312
- let atom = equality_op
309
+ let atom = relational_op
313
310
. or ( var. or ( literal) . map_with_span ( |expr, span| ( expr, span) ) )
314
311
// Atoms can also just be normal expressions, but surrounded with parentheses
315
312
. or ( expr. clone ( ) . delimited_by ( just ( Token :: LParen ) , just ( Token :: RParen ) ) )
@@ -328,28 +325,23 @@ pub fn parser<'tokens, 'src: 'tokens>(
328
325
. foldr ( atom, |op, rhs| {
329
326
let span = op. 1 . start ..rhs. 1 . end ;
330
327
( Expr :: unary_op ( op. 0 , Box :: new ( rhs) , None ) , span. into ( ) )
331
- } ) ;
332
-
333
- let next_op = just ( Token :: Next )
334
- . map_with_span ( |_, span : Span | ( UnaryOps :: Next , span) )
335
- . then ( interval. or_not ( ) )
336
- . repeated ( )
337
- . foldr ( not_op, |( op, interval) , rhs| {
338
- let span = op. 1 . start ..rhs. 1 . end ;
339
- ( Expr :: unary_op ( op. 0 , Box :: new ( rhs) , interval) , span. into ( ) )
340
- } ) ;
328
+ } )
329
+ . boxed ( ) ;
341
330
342
331
let unary_temporal_op = {
343
- let op = just ( Token :: Eventually )
344
- . to ( UnaryOps :: Eventually )
345
- . or ( just ( Token :: Always ) . to ( UnaryOps :: Always ) ) ;
332
+ let op = choice ( (
333
+ just ( Token :: Next ) . to ( UnaryOps :: Next ) ,
334
+ just ( Token :: Eventually ) . to ( UnaryOps :: Eventually ) ,
335
+ just ( Token :: Always ) . to ( UnaryOps :: Always ) ,
336
+ ) ) ;
346
337
op. map_with_span ( |op, span : Span | ( op, span) )
347
- . then ( interval. or_not ( ) )
338
+ . then ( interval. clone ( ) . or_not ( ) )
348
339
. repeated ( )
349
- . foldr ( next_op , |( op, interval) , rhs| {
340
+ . foldr ( not_op , |( op, interval) , rhs| {
350
341
let span = op. 1 . start ..rhs. 1 . end ;
351
342
( Expr :: unary_op ( op. 0 , Box :: new ( rhs) , interval) , span. into ( ) )
352
343
} )
344
+ . boxed ( )
353
345
} ;
354
346
355
347
let binary_temporal_op = unary_temporal_op
@@ -363,7 +355,8 @@ pub fn parser<'tokens, 'src: 'tokens>(
363
355
Expr :: binary_op ( op, ( Box :: new ( lhs) , Box :: new ( rhs) ) , interval) ,
364
356
span. into ( ) ,
365
357
)
366
- } ) ;
358
+ } )
359
+ . boxed ( ) ;
367
360
368
361
let and_op = {
369
362
let op = just ( Token :: And ) . to ( BinaryOps :: And ) ;
@@ -373,34 +366,44 @@ pub fn parser<'tokens, 'src: 'tokens>(
373
366
let span = a. 1 . start ..b. 1 . end ;
374
367
( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
375
368
} )
369
+ . boxed ( )
376
370
} ;
377
371
378
372
let or_op = {
379
373
let op = just ( Token :: Or ) . to ( BinaryOps :: Or ) ;
380
- and_op. clone ( ) . foldl ( op. then ( and_op) . repeated ( ) , |a, ( op, b) | {
381
- let span = a. 1 . start ..b. 1 . end ;
382
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
383
- } )
374
+ and_op
375
+ . clone ( )
376
+ . foldl ( op. then ( and_op) . repeated ( ) , |a, ( op, b) | {
377
+ let span = a. 1 . start ..b. 1 . end ;
378
+ ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
379
+ } )
380
+ . boxed ( )
384
381
} ;
385
382
386
383
let xor_op = {
387
384
let op = just ( Token :: Xor ) . to ( BinaryOps :: Xor ) ;
388
- or_op. clone ( ) . foldl ( op. then ( or_op) . repeated ( ) , |a, ( op, b) | {
389
- let span = a. 1 . start ..b. 1 . end ;
390
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
391
- } )
385
+ or_op
386
+ . clone ( )
387
+ . foldl ( op. then ( or_op) . repeated ( ) , |a, ( op, b) | {
388
+ let span = a. 1 . start ..b. 1 . end ;
389
+ ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
390
+ } )
391
+ . boxed ( )
392
392
} ;
393
393
394
394
let implies_equiv_op = {
395
395
let op = just ( Token :: Implies )
396
396
. to ( BinaryOps :: Implies )
397
397
. or ( just ( Token :: Equiv ) . to ( BinaryOps :: Equiv ) ) ;
398
- xor_op. clone ( ) . foldl ( op. then ( xor_op) . repeated ( ) , |a, ( op, b) | {
399
- let span = a. 1 . start ..b. 1 . end ;
400
- ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
401
- } )
398
+ xor_op
399
+ . clone ( )
400
+ . foldl ( op. then ( xor_op) . repeated ( ) , |a, ( op, b) | {
401
+ let span = a. 1 . start ..b. 1 . end ;
402
+ ( Expr :: binary_op ( op, ( Box :: new ( a) , Box :: new ( b) ) , None ) , span. into ( ) )
403
+ } )
404
+ . boxed ( )
402
405
} ;
403
406
404
- implies_equiv_op. labelled ( "expression" ) . as_context ( )
407
+ implies_equiv_op. labelled ( "boolean expression" ) . as_context ( )
405
408
} )
406
409
}
0 commit comments