@@ -738,9 +738,15 @@ fn parse_expr(tokens: &[Token], start: usize, end: usize) -> Option<Expr> {
738738fn parse_binary_expr ( tokens : & [ Token ] , start : usize , end : usize ) -> Option < Expr > {
739739 find_top_level_binary_operator ( tokens, start, end, "|" , "|" )
740740 . or_else ( || find_top_level_binary_operator ( tokens, start, end, "&" , "&" ) )
741+ . or_else ( || find_top_level_single_binary_operator ( tokens, start, end, "+" , BinaryOp :: Add ) )
741742 . and_then ( |( operator, op) | {
742743 let left = parse_expr ( tokens, start, operator) ?;
743- let right = parse_expr ( tokens, operator + 2 , end) ?;
744+ let right_start = if matches ! ( op, BinaryOp :: Add ) {
745+ operator + 1
746+ } else {
747+ operator + 2
748+ } ;
749+ let right = parse_expr ( tokens, right_start, end) ?;
744750 Some ( Expr :: Binary {
745751 op,
746752 left : Box :: new ( left) ,
@@ -750,6 +756,31 @@ fn parse_binary_expr(tokens: &[Token], start: usize, end: usize) -> Option<Expr>
750756 } )
751757}
752758
759+ fn find_top_level_single_binary_operator (
760+ tokens : & [ Token ] ,
761+ start : usize ,
762+ end : usize ,
763+ symbol : & str ,
764+ op : BinaryOp ,
765+ ) -> Option < ( usize , BinaryOp ) > {
766+ let mut depth = 0usize ;
767+ let mut found = None ;
768+ for ( index, token) in tokens. iter ( ) . enumerate ( ) . take ( end) . skip ( start) {
769+ if token. symbol ( "(" ) || token. symbol ( "{" ) || token. symbol ( "[" ) || token. symbol ( "<" ) {
770+ depth += 1 ;
771+ continue ;
772+ }
773+ if token. symbol ( ")" ) || token. symbol ( "}" ) || token. symbol ( "]" ) || token. symbol ( ">" ) {
774+ depth = depth. saturating_sub ( 1 ) ;
775+ continue ;
776+ }
777+ if depth == 0 && token. symbol ( symbol) {
778+ found = Some ( ( index, op) ) ;
779+ }
780+ }
781+ found
782+ }
783+
753784fn find_trailing_top_level_question ( tokens : & [ Token ] , start : usize , end : usize ) -> Option < usize > {
754785 if end <= start || !tokens. get ( end - 1 ) . is_some_and ( |token| token. symbol ( "?" ) ) {
755786 return None ;
0 commit comments