Shells in OCaml
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

Better arith parsing -- not perfect

+9 -9
+1 -1
test/modernish.t
··· 3 3 $ cat > arith.sh << EOF 4 4 > i=7 5 5 > j=0 6 - > case \$(( ( (j+=6*i)==0x2A)>0 ? 014 : 015 )) in 6 + > case \$(( ((j+=6*i)==0x2A)>0 ? 014 : 015 )) in 7 7 > ( 12 | 14 ) ;; # OK or BUG_NOOCTAL 8 8 > ( * ) exit ;; 9 9 > esac
+8 -8
vendor/morbig.0.11.0/src/prelexer.mll
··· 433 433 | "$((" { 434 434 debug ~rule:"arithmetic-exp" lexbuf current; 435 435 let current = push_arith current in 436 - let current = next_double_rparen 1 current lexbuf in 436 + let current = next_double_rparen true 1 current lexbuf in 437 437 token current lexbuf 438 438 } 439 439 ··· 714 714 lexing_error lexbuf (Printf.sprintf "Unclosed subshell (got '%c')" c) 715 715 } 716 716 717 - and next_double_rparen dplevel current = parse 717 + and next_double_rparen in_arith dplevel current = parse 718 718 | "((" { 719 719 let current = push_string current "((" in 720 - next_double_rparen (dplevel+1) current lexbuf 720 + next_double_rparen in_arith (if in_arith then dplevel else dplevel+1) current lexbuf 721 721 } 722 - | "$((" { 722 + | "$((" { 723 723 debug ~rule:"arithmetic-exp" lexbuf current; 724 724 let current = push_arith current in 725 - let current = next_double_rparen (dplevel+1) current lexbuf in 725 + let current = next_double_rparen true (dplevel+1) current lexbuf in 726 726 current 727 727 } 728 728 | '`' as op | "$" ( '(' as op) { ··· 731 731 let current = subshell op escaping_level current lexbuf in 732 732 let expected_closing_char = if op = '`' then '`' else ')' in 733 733 let current = close_subshell expected_closing_char current lexbuf in 734 - next_double_rparen dplevel current lexbuf 734 + next_double_rparen in_arith dplevel current lexbuf 735 735 } 736 736 | "))" { 737 737 let current = pop_arith current in 738 738 if dplevel = 1 739 739 then current 740 - else if dplevel > 1 then next_double_rparen (dplevel-1) current lexbuf 740 + else if dplevel > 1 then next_double_rparen false (dplevel-1) current lexbuf 741 741 else assert false 742 742 } 743 743 | eof { 744 744 lexing_error lexbuf "Unterminated arithmetic expression." 745 745 } 746 746 | _ as c { 747 - next_double_rparen dplevel (push_character current c) lexbuf 747 + next_double_rparen in_arith dplevel (push_character current c) lexbuf 748 748 } 749 749 750 750 (*specification: