diff --git a/test/modernish.t b/test/modernish.t index 114e56e..961c95b 100644 --- a/test/modernish.t +++ b/test/modernish.t @@ -3,7 +3,7 @@ These these are from parts of the modernish checks. $ cat > arith.sh << EOF > i=7 > j=0 - > case \$(( ( (j+=6*i)==0x2A)>0 ? 014 : 015 )) in + > case \$(( ((j+=6*i)==0x2A)>0 ? 014 : 015 )) in > ( 12 | 14 ) ;; # OK or BUG_NOOCTAL > ( * ) exit ;; > esac diff --git a/vendor/morbig.0.11.0/src/prelexer.mll b/vendor/morbig.0.11.0/src/prelexer.mll index 4e00453..b741a37 100644 --- a/vendor/morbig.0.11.0/src/prelexer.mll +++ b/vendor/morbig.0.11.0/src/prelexer.mll @@ -433,7 +433,7 @@ rule token current = parse | "$((" { debug ~rule:"arithmetic-exp" lexbuf current; let current = push_arith current in - let current = next_double_rparen 1 current lexbuf in + let current = next_double_rparen true 1 current lexbuf in token current lexbuf } @@ -714,15 +714,15 @@ and close_subshell expected_closing_char current = parse lexing_error lexbuf (Printf.sprintf "Unclosed subshell (got '%c')" c) } -and next_double_rparen dplevel current = parse +and next_double_rparen in_arith dplevel current = parse | "((" { let current = push_string current "((" in - next_double_rparen (dplevel+1) current lexbuf + next_double_rparen in_arith (if in_arith then dplevel else dplevel+1) current lexbuf } -| "$((" { + | "$((" { debug ~rule:"arithmetic-exp" lexbuf current; let current = push_arith current in - let current = next_double_rparen (dplevel+1) current lexbuf in + let current = next_double_rparen true (dplevel+1) current lexbuf in current } | '`' as op | "$" ( '(' as op) { @@ -731,20 +731,20 @@ and next_double_rparen dplevel current = parse let current = subshell op escaping_level current lexbuf in let expected_closing_char = if op = '`' then '`' else ')' in let current = close_subshell expected_closing_char current lexbuf in - next_double_rparen dplevel current lexbuf + next_double_rparen in_arith dplevel current lexbuf } | "))" { let current = pop_arith current in if dplevel = 1 then current - else if dplevel > 1 then next_double_rparen (dplevel-1) current lexbuf + else if dplevel > 1 then next_double_rparen false (dplevel-1) current lexbuf else assert false } | eof { lexing_error lexbuf "Unterminated arithmetic expression." } | _ as c { - next_double_rparen dplevel (push_character current c) lexbuf + next_double_rparen in_arith dplevel (push_character current c) lexbuf } (*specification: