(List (FunctionDef throw [] (List (Com {[LIT_CHARS echo]} {[DQ [VarSub *]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]}) ) ) (= scope= flags=0 words=[] bindings=[('BRIEF', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('LEAFONLY', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('PRUNE', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('NO_HEAD', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('NORMALIZE_SOLIDUS', {[LIT_CHARS 0]})]) (FunctionDef usage [] (List (Com {[LIT_CHARS echo]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]"]]}) (Com {[LIT_CHARS echo]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-p - Prune empty. Exclude fields with empty values."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-l - Leaf only. Only show leaf nodes, which stops data duplication."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-b - Brief. Combines 'Leaf only' and 'Prune empty' options."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-n - No-head. Do not show nodes that have no path (lines that start with [])."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-s - Remove escaping of the solidus symbol (straight slash)."]]}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-h - This help text."]]}) (Com {[LIT_CHARS echo]}) ) ) (FunctionDef parse_options [] (List (Com {[LIT_CHARS set]} {[LIT_CHARS --]} {[DQ [VarSub @]]}) (= scope= flags=0 words=[] bindings=[('ARGN', {[VarSub #]})]) (While (Com {[LIT_OTHER "["]} {[DQ [VarSub ARGN]]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (List (Case to_match={[VarSub 1]}, pat_word_list=[[{[LIT_CHARS -h]}], [{[LIT_CHARS -b]}], [{[LIT_CHARS -l]}], [{[LIT_CHARS -p]}], [{[LIT_CHARS -n]}], [{[LIT_CHARS -s]}], [{[LIT_OTHER "?"] [LIT_OTHER "*"]}]] (List (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]}) ) (List (= scope= flags=0 words=[] bindings=[('BRIEF', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('LEAFONLY', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('PRUNE', {[LIT_CHARS 1]})]) ) (= scope= flags=0 words=[] bindings=[('LEAFONLY', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('PRUNE', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('NO_HEAD', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('NORMALIZE_SOLIDUS', {[LIT_CHARS 1]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Unknown option."]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]}) ) ) (Com {[LIT_CHARS shift]} {[LIT_CHARS 1]}) (= scope= flags=0 words=[] bindings=[('ARGN', {[ArithSub {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub ARGN]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) ) ) (FunctionDef awk_egrep [] (List (= scope= flags=0 words=[] bindings=[('pattern_string', {[VarSub 1]})]) (Com {[LIT_CHARS gawk]} {[SQ ]} {[LIT_VAR_LIKE "pattern="] [DQ [VarSub pattern_string]] =}) ) ) (FunctionDef tokenize [] (List (= scope= flags=0 words=[{[LIT_CHARS GREP]}] bindings=[]) (= scope= flags=0 words=[{[LIT_CHARS ESCAPE]}] bindings=[]) (= scope= flags=0 words=[{[LIT_CHARS CHAR]}] bindings=[]) (If (Pipeline (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "test string"]]}) (Com {[LIT_CHARS egrep]} {[LIT_CHARS -ao]} {[LIT_CHARS --color] [LIT_OTHER "="] [LIT_CHARS never]} {[DQ [LIT_CHARS test]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('GREP', {[SQ ]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('GREP', {[SQ ]})]) ) (If (Pipeline (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "test string"]]}) (Com {[LIT_CHARS egrep]} {[LIT_CHARS -o]} {[DQ [LIT_CHARS test]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (List (= scope= flags=0 words=[] bindings=[('ESCAPE', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('CHAR', {[SQ ]})]) ) (ElseTrue) (List (= scope= flags=0 words=[] bindings=[('GREP', {[LIT_CHARS awk_egrep]})]) (= scope= flags=0 words=[] bindings=[('ESCAPE', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('CHAR', {[SQ ]})]) ) ) (= scope= flags=0 words=[] bindings=[('STRING', {[DQ [\ LIT_ESCAPED_CHAR "\\\""][VarSub CHAR][LIT_CHARS "*("][VarSub ESCAPE][VarSub CHAR][LIT_CHARS "*)*"][\ LIT_ESCAPED_CHAR "\\\""]]})]) (= scope= flags=0 words=[] bindings=[('NUMBER', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('KEYWORD', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('SPACE', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('is_wordsplit_disabled', {[ComSub (Pipeline (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS unsetopt]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -c]} {[SQ ]}) )]})]) (If (Com {[LIT_OTHER "["]} {[VarSub is_wordsplit_disabled]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS setopt]} {[LIT_CHARS shwordsplit]}) ) (Pipeline (Com {[VarSub GREP]} {[DQ [VarSub STRING][LIT_CHARS "|"][VarSub NUMBER][LIT_CHARS "|"][VarSub KEYWORD][LIT_CHARS "|"][VarSub SPACE][LIT_CHARS "|."]]}) (Com {[LIT_CHARS egrep]} {[LIT_CHARS -v]} {[DQ [LIT_CHARS "^"][VarSub SPACE][LIT_OTHER "$"]]}) ) (If (Com {[LIT_OTHER "["]} {[VarSub is_wordsplit_disabled]} {[LIT_OTHER "!"] [LIT_OTHER "="]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS unsetopt]} {[LIT_CHARS shwordsplit]}) ) ) ) (FunctionDef parse_array [] (List (= scope= flags=0 words=[] bindings=[('index', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('ary', {[SQ ]})]) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[LIT_OTHER "*"]}]] (ElseTrue) (While (Com {[LIT_OTHER ":"]}) (List (Com {[LIT_CHARS parse_value]} {[DQ [VarSub 1]]} {[DQ [VarSub index]]}) (= scope= flags=0 words=[] bindings=[('index', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub index]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) (= scope= flags=0 words=[] bindings=[('ary', {[DQ [VarSub ary]] [DQ [VarSub value]]})]) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[SQ ]}], [{[LIT_OTHER "*"]}]] (Com {[LIT_CHARS break]}) (= scope= flags=0 words=[] bindings=[('ary', {[DQ [VarSub ary][LIT_CHARS ","]]})]) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED , or ] GOT "][VarSub token test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS EOF]}]]}) ) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub BRIEF]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('value', {[ComSub (Com {[LIT_CHARS printf]} {[SQ ]} {[DQ [VarSub ary]]})]})]) (= scope= flags=0 words=[] bindings=[('value', {[SQ ]})]) ) ) (Com {[LIT_OTHER ":"]}) ) ) (FunctionDef parse_object [] (List (= scope= flags=0 words=[{[LIT_CHARS key]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('obj', {[SQ ]})]) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[LIT_OTHER "*"]}]] (ElseTrue) (While (Com {[LIT_OTHER ":"]}) (List (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ] [LIT_OTHER "*"] [SQ ]}], [{[LIT_OTHER "*"]}]] (= scope= flags=0 words=[] bindings=[('key', {[VarSub token]})]) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED string GOT "][VarSub token test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS EOF]}]]}) ) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[LIT_OTHER "*"]}]] (ElseTrue) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED : GOT "][VarSub token test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS EOF]}]]}) ) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Com {[LIT_CHARS parse_value]} {[DQ [VarSub 1]]} {[DQ [VarSub key]]}) (= scope= flags=0 words=[] bindings=[('obj', {[DQ [VarSub obj][VarSub key][LIT_CHARS ":"][VarSub value]]})]) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[SQ ]}], [{[LIT_OTHER "*"]}]] (Com {[LIT_CHARS break]}) (= scope= flags=0 words=[] bindings=[('obj', {[DQ [VarSub obj][LIT_CHARS ","]]})]) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED , or } GOT "][VarSub token test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS EOF]}]]}) ) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub BRIEF]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('value', {[ComSub (Com {[LIT_CHARS printf]} {[SQ ]} {[DQ [VarSub obj]]})]})]) (= scope= flags=0 words=[] bindings=[('value', {[SQ ]})]) ) ) (Com {[LIT_OTHER ":"]}) ) ) (FunctionDef parse_value [] (List (= scope= flags=0 words=[] bindings=[('jpath', {[DQ [VarSub 1 test_op=VS_TEST_COLON_PLUS {[VarSub 1] [LIT_CHARS ","]}][VarSub 2]]}), ('isleaf', {[LIT_CHARS 0]}), ('isempty', {[LIT_CHARS 0]}), ('print', {[LIT_CHARS 0]})]) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[SQ ]}], [{[SQ ]}, {[LIT_OTHER "["] [LIT_OTHER "!"] [LIT_CHARS 0-9] [LIT_OTHER "]"]}], [{[LIT_OTHER "*"]}]] (Com {[LIT_CHARS parse_object]} {[DQ [VarSub jpath]]}) (Com {[LIT_CHARS parse_array]} {[DQ [VarSub jpath]]}) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED value GOT "][VarSub token test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS EOF]}]]}) (List (= scope= flags=0 words=[] bindings=[('value', {[VarSub token]})]) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub NORMALIZE_SOLIDUS]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('value', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub value]]}) (Com {[LIT_CHARS sed]} {[SQ ]}) )]})]) ) (= scope= flags=0 words=[] bindings=[('isleaf', {[LIT_CHARS 1]})]) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub value]]} {[LIT_OTHER "="]} {[SQ ]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('isempty', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub value]]} {[LIT_OTHER "="]} {[SQ ]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS return]}) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub NO_HEAD]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[LIT_CHARS -z]} {[DQ [VarSub jpath]]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS return]}) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub PRUNE]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub isleaf]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[VarSub PRUNE]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub PRUNE]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub isempty]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub isleaf]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[VarSub PRUNE]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[VarSub isempty]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_OTHER "]"]}) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub print]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "[%s]"][\ LIT_ESCAPED_CHAR "\\t"][LIT_CHARS "%s"][\ LIT_ESCAPED_CHAR "\\n"]]} {[DQ [VarSub jpath]]} {[DQ [VarSub value]]}) ) (Com {[LIT_OTHER ":"]}) ) ) (FunctionDef parse [] (List (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Com {[LIT_CHARS parse_value]}) (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS token]}) (Case to_match={[DQ [VarSub token]]}, pat_word_list=[[{[SQ ]}], [{[LIT_OTHER "*"]}]] (ElseTrue) (Com {[LIT_CHARS throw]} {[DQ [LIT_CHARS "EXPECTED EOF GOT "][VarSub token]]}) ) ) ) (If (Subshell (AndOr OP_OR_IF (Com {[LIT_OTHER "["]} {[DQ [VarSub 0]]} {[LIT_OTHER "="]} {[DQ [VarSub BASH_SOURCE]]} {[LIT_OTHER "]"]}) (Pipeline! (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub BASH_SOURCE]]} {[LIT_OTHER "]"]}) ) ) ) (List (Com {[LIT_CHARS parse_options]} {[DQ [VarSub @]]}) (Pipeline (Com {[LIT_CHARS tokenize]}) (Com {[LIT_CHARS parse]}) ) ) ) )