@@ -412,56 +412,55 @@ where
412412 }
413413
414414 fn parse_binop_1 ( & mut self ) -> Result < FormulaOrTerm < T :: Output > > {
415- let lhs = self . parse_prefix ( ) ?;
415+ let mut formula_or_term = self . parse_prefix ( ) ?;
416416
417- let formula_or_term = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
418- Some ( TokenKind :: BinOp ( BinOpToken :: Star ) ) => {
419- self . consume ( ) ;
420- let ( lhs, _) = lhs
421- . into_term ( )
422- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before * operator" ) ) ?;
423- let ( rhs, _) = self
424- . parse_prefix ( ) ?
425- . into_term ( )
426- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after * operator" ) ) ?;
427- FormulaOrTerm :: Term ( lhs. mul ( rhs) , chc:: Sort :: int ( ) )
428- }
429- _ => return Ok ( lhs) ,
430- } ;
417+ while let Some ( TokenKind :: BinOp ( BinOpToken :: Star ) ) =
418+ self . look_ahead_token ( 0 ) . map ( |t| & t. kind )
419+ {
420+ self . consume ( ) ;
421+ let ( lhs, _) = formula_or_term
422+ . into_term ( )
423+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before * operator" ) ) ?;
424+ let ( rhs, _) = self
425+ . parse_prefix ( ) ?
426+ . into_term ( )
427+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after * operator" ) ) ?;
428+ formula_or_term = FormulaOrTerm :: Term ( lhs. mul ( rhs) , chc:: Sort :: int ( ) )
429+ }
431430
432431 Ok ( formula_or_term)
433432 }
434433
435434 fn parse_binop_2 ( & mut self ) -> Result < FormulaOrTerm < T :: Output > > {
436- let lhs = self . parse_binop_1 ( ) ?;
435+ let mut formula_or_term = self . parse_binop_1 ( ) ?;
437436
438- let formula_or_term = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
439- Some ( TokenKind :: BinOp ( BinOpToken :: Plus ) ) => {
440- self . consume ( ) ;
441- let ( lhs, _) = lhs
442- . into_term ( )
443- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before + operator" ) ) ?;
444- let ( rhs, _) = self
445- . parse_binop_1 ( ) ?
446- . into_term ( )
447- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after + operator" ) ) ?;
448- FormulaOrTerm :: Term ( lhs. add ( rhs) , chc:: Sort :: int ( ) )
449- }
450- Some ( TokenKind :: BinOp ( BinOpToken :: Minus ) ) => {
451- self . consume ( ) ;
452- let ( lhs, _) = lhs
453- . into_term ( )
454- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before - operator" ) ) ?;
455- let ( rhs, _) = self
456- . parse_binop_1 ( ) ?
457- . into_term ( )
458- . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after - operator" ) ) ?;
459- FormulaOrTerm :: Term ( lhs. sub ( rhs) , chc:: Sort :: int ( ) )
437+ loop {
438+ match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
439+ Some ( TokenKind :: BinOp ( BinOpToken :: Plus ) ) => {
440+ self . consume ( ) ;
441+ let ( lhs, _) = formula_or_term
442+ . into_term ( )
443+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before + operator" ) ) ?;
444+ let ( rhs, _) = self
445+ . parse_binop_1 ( ) ?
446+ . into_term ( )
447+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after + operator" ) ) ?;
448+ formula_or_term = FormulaOrTerm :: Term ( lhs. add ( rhs) , chc:: Sort :: int ( ) )
449+ }
450+ Some ( TokenKind :: BinOp ( BinOpToken :: Minus ) ) => {
451+ self . consume ( ) ;
452+ let ( lhs, _) = formula_or_term
453+ . into_term ( )
454+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "before - operator" ) ) ?;
455+ let ( rhs, _) = self
456+ . parse_binop_1 ( ) ?
457+ . into_term ( )
458+ . ok_or_else ( || ParseAttrError :: unexpected_formula ( "after - operator" ) ) ?;
459+ formula_or_term = FormulaOrTerm :: Term ( lhs. sub ( rhs) , chc:: Sort :: int ( ) )
460+ }
461+ _ => return Ok ( formula_or_term) ,
460462 }
461- _ => return Ok ( lhs) ,
462- } ;
463-
464- Ok ( formula_or_term)
463+ }
465464 }
466465
467466 fn parse_binop_3 ( & mut self ) -> Result < FormulaOrTerm < T :: Output > > {
@@ -541,43 +540,37 @@ where
541540 }
542541
543542 fn parse_binop_4 ( & mut self ) -> Result < FormulaOrTerm < T :: Output > > {
544- let lhs = self . parse_binop_3 ( ) ?;
543+ let mut formula_or_term = self . parse_binop_3 ( ) ?;
545544
546- let formula_or_term = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
547- Some ( TokenKind :: AndAnd ) => {
548- self . consume ( ) ;
549- let lhs = lhs
550- . into_formula ( )
551- . ok_or_else ( || ParseAttrError :: unexpected_term ( "before && operator" ) ) ?;
552- let rhs = self
553- . parse_binop_3 ( ) ?
554- . into_formula ( )
555- . ok_or_else ( || ParseAttrError :: unexpected_term ( "after && operator" ) ) ?;
556- FormulaOrTerm :: Formula ( lhs. and ( rhs) )
557- }
558- _ => return Ok ( lhs) ,
559- } ;
545+ while let Some ( TokenKind :: AndAnd ) = self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
546+ self . consume ( ) ;
547+ let lhs = formula_or_term
548+ . into_formula ( )
549+ . ok_or_else ( || ParseAttrError :: unexpected_term ( "before && operator" ) ) ?;
550+ let rhs = self
551+ . parse_binop_3 ( ) ?
552+ . into_formula ( )
553+ . ok_or_else ( || ParseAttrError :: unexpected_term ( "after && operator" ) ) ?;
554+ formula_or_term = FormulaOrTerm :: Formula ( lhs. and ( rhs) )
555+ }
560556
561557 Ok ( formula_or_term)
562558 }
563559
564560 fn parse_binop_5 ( & mut self ) -> Result < FormulaOrTerm < T :: Output > > {
565- let lhs = self . parse_binop_4 ( ) ?;
561+ let mut formula_or_term = self . parse_binop_4 ( ) ?;
566562
567- let formula_or_term = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
568- Some ( TokenKind :: OrOr ) => {
569- self . consume ( ) ;
570- let lhs = lhs
571- . into_formula ( )
572- . ok_or_else ( || ParseAttrError :: unexpected_term ( "before || operator" ) ) ?;
573- let rhs = self
574- . parse_binop_4 ( ) ?
575- . into_formula ( )
576- . ok_or_else ( || ParseAttrError :: unexpected_term ( "after || operator" ) ) ?;
577- FormulaOrTerm :: Formula ( lhs. or ( rhs) )
578- }
579- _ => return Ok ( lhs) ,
580- } ;
563+ while let Some ( TokenKind :: OrOr ) = self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
564+ self . consume ( ) ;
565+ let lhs = formula_or_term
566+ . into_formula ( )
567+ . ok_or_else ( || ParseAttrError :: unexpected_term ( "before || operator" ) ) ?;
568+ let rhs = self
569+ . parse_binop_4 ( ) ?
570+ . into_formula ( )
571+ . ok_or_else ( || ParseAttrError :: unexpected_term ( "after || operator" ) ) ?;
572+ formula_or_term = FormulaOrTerm :: Formula ( lhs. or ( rhs) )
573+ }
581574
582575 Ok ( formula_or_term)
583576 }
0 commit comments