(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_DBRACKET_LIKE "["]} {[DQ [VarSub ARGN]]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (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 ASOP_MINUS {A Atom AS_WORD {[VarSub ARGN]}} {A Atom AS_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_DBRACKET_LIKE "="] [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_DBRACKET_LIKE "["]} {[VarSub is_wordsplit_disabled]} {[LIT_NEQUAL "!="]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (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_DBRACKET_LIKE "["]} {[VarSub is_wordsplit_disabled]} {[LIT_NEQUAL "!="]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (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 ASOP_PLUS {A Atom AS_WORD {[VarSub index]}} {A Atom AS_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_DBRACKET_LIKE "["]} {[DQ [VarSub BRIEF]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (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_DBRACKET_LIKE "["]} {[DQ [VarSub BRIEF]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (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_DBRACKET_LIKE "["] [LIT_OTHER "!"] [LIT_CHARS 0-9] [LIT_DBRACKET_LIKE "]"]}], [{[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_DBRACKET_LIKE "["]} {[DQ [VarSub NORMALIZE_SOLIDUS]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (= 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_DBRACKET_LIKE "["]} {[DQ [VarSub value]]} {[LIT_DBRACKET_LIKE "="]} {[SQ ]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('isempty', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub value]]} {[LIT_DBRACKET_LIKE "="]} {[SQ ]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS return]} ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub NO_HEAD]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub jpath]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS return]} ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub PRUNE]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub isleaf]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub PRUNE]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub PRUNE]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub isempty]]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub LEAFONLY]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub isleaf]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub PRUNE]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub isempty]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('print', {[LIT_CHARS 1]})]) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub print]]} {[LIT_CHARS -eq]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (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_DBRACKET_LIKE "["]} {[DQ [VarSub 0]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [VarSub BASH_SOURCE]]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub BASH_SOURCE]]} {[LIT_DBRACKET_LIKE "]"]} ) ) ) ) (List (Com {[LIT_CHARS parse_options]} {[DQ [VarSub @]]} ) (Pipeline (Com {[LIT_CHARS tokenize]} ) (Com {[LIT_CHARS parse]} ) ) ) ) )