Gentoo Archives: gentoo-commits

From: "Petteri Räty" <betelgeuse@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, bashast/gunit/, bashast/features_script/
Date: Sun, 03 Jun 2012 09:10:06
Message-Id: 1330413775.565c53e2416f102a845e78b96360f6e39f5d1637.betelgeuse@gentoo
1 commit: 565c53e2416f102a845e78b96360f6e39f5d1637
2 Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
3 AuthorDate: Tue Feb 28 07:22:55 2012 +0000
4 Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
5 CommitDate: Tue Feb 28 07:22:55 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=565c53e2
7
8 Parser&Walker: allow multiple arithmetic expressions
9
10 ---
11 bashast/bashast.g | 18 ++-
12 bashast/features_script/features.sh.ast | 2 +-
13 bashast/features_script/features.sh.walker.tokens | 2 +-
14 bashast/gunit/arith_main.gunit | 157 +++++++++++----------
15 bashast/gunit/array.gunit | 20 ++--
16 bashast/gunit/assoc_array.gunit | 12 +-
17 bashast/gunit/compound.gunit | 18 ++--
18 bashast/gunit/expansions.gunit | 6 +-
19 bashast/gunit/param_main.gunit | 13 +-
20 bashast/libbashWalker.g | 22 +++-
21 scripts/arithmetic_assignment.bash | 5 +-
22 scripts/command_execution.bash | 1 +
23 scripts/compound_command.bash | 5 +
24 scripts/var_def.bash | 4 +
25 scripts/var_expansion.bash | 2 +
26 15 files changed, 161 insertions(+), 126 deletions(-)
27
28 diff --git a/bashast/bashast.g b/bashast/bashast.g
29 index 8286a00..ded2fab 100644
30 --- a/bashast/bashast.g
31 +++ b/bashast/bashast.g
32 @@ -68,6 +68,7 @@ tokens{
33 REDIR;
34 ARITHMETIC_CONDITION;
35 ARITHMETIC_EXPRESSION;
36 + ARITHMETIC;
37 KEYWORD_TEST;
38 BUILTIN_TEST;
39 MATCH_ANY_EXCEPT;
40 @@ -525,11 +526,11 @@ for_expr
41 ) DO wspace command_list semiel DONE -> ^(FOR name for_each_value* command_list)
42 | LLPAREN EOL?
43 // initilization
44 - (BLANK? init=arithmetic BLANK?|BLANK)?
45 + (BLANK? init=arithmetics BLANK?|BLANK)?
46 // condition
47 - (SEMIC (BLANK? fcond=arithmetic BLANK?|BLANK)? SEMIC|DOUBLE_SEMIC)
48 + (SEMIC (BLANK? fcond=arithmetics BLANK?|BLANK)? SEMIC|DOUBLE_SEMIC)
49 // modification
50 - (BLANK? mod=arithmetic)? wspace? RPAREN RPAREN semiel DO wspace command_list semiel DONE
51 + (BLANK? mod=arithmetics)? wspace? RPAREN RPAREN semiel DO wspace command_list semiel DONE
52 -> ^(CFOR ^(FOR_INIT $init)? ^(FOR_COND $fcond)? command_list ^(FOR_MOD $mod)?)
53 );
54 for_each_value
55 @@ -585,7 +586,7 @@ current_shell
56 : LBRACE wspace command_list semiel RBRACE -> ^(CURRENT_SHELL command_list);
57
58 arithmetic_expression
59 - : LLPAREN wspace? arithmetic wspace? RPAREN RPAREN -> ^(ARITHMETIC_EXPRESSION arithmetic);
60 + : LLPAREN wspace? arithmetics wspace? RPAREN RPAREN -> ^(ARITHMETIC_EXPRESSION arithmetics);
61 condition_comparison
62 : condition_expr -> ^(COMPOUND_COND condition_expr);
63
64 @@ -841,9 +842,12 @@ parameter_expansion
65 | COLON BLANK?
66 (
67 os=explicit_arithmetic (COLON BLANK? len=explicit_arithmetic)?
68 - -> ^(OFFSET variable_name $os ^($len)?)
69 + // It will make the tree parser's work easier if OFFSET is used as the root of arithmetic.
70 + // Otherwise, the tree parser can see several arithmetic expressions but can not tell
71 + // which one is for offset and which one is for length.
72 + -> ^(OFFSET variable_name ^(OFFSET $os) ^(OFFSET ^($len))?)
73 | COLON BLANK? len=explicit_arithmetic
74 - -> ^(OFFSET variable_name NUMBER["0"] ^($len)?)
75 + -> ^(OFFSET variable_name ^(OFFSET NUMBER["0"]) ^(OFFSET ^($len))?)
76 )
77 | parameter_delete_operator parameter_delete_pattern
78 -> ^(parameter_delete_operator variable_name parameter_delete_pattern)
79 @@ -962,7 +966,7 @@ arithmetic_part
80 | DOLLAR LSQUARE BLANK? arithmetics BLANK? RSQUARE -> arithmetics;
81
82 arithmetics
83 - : arithmetic (COMMA! BLANK!? arithmetic)*;
84 + : arithmetic (COMMA BLANK? arithmetic)* -> ^(ARITHMETIC arithmetic)+;
85
86 arithmetics_test
87 : arithmetics EOF!;
88
89 diff --git a/bashast/features_script/features.sh.ast b/bashast/features_script/features.sh.ast
90 index fc0eb4c..60d71b3 100644
91 --- a/bashast/features_script/features.sh.ast
92 +++ b/bashast/features_script/features.sh.ast
93 @@ -1 +1 @@
94 -(LIST (COMMAND (FUNCTION (STRING lots_o_echo) (CURRENT_SHELL (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING The number of tests that have failed : (VAR_REF failedtests)))) (COMMAND (STRING echo) (STRING (SINGLE_QUOTED_STRING '$failedtests'))) (COMMAND (STRING echo) (STRING (VAR_REF failedtests))))))) (COMMAND (FUNCTION (STRING do_some_arith) (CURRENT_SHELL (LIST (COMMAND (ARITHMETIC_EXPRESSION (* 5 4))) (COMMAND (ARITHMETIC_EXPRESSION (** 5 4))) (COMMAND (ARITHMETIC_EXPRESSION (+ (VAR_REF failedtests) (/ 5 4)))) (COMMAND (ARITHMETIC_EXPRESSION (+ (VAR_REF z) (MINUS_SIGN 3)))))))) (COMMAND (FUNCTION (STRING arrays) (SUBSHELL (LIST (COMMAND (VARIABLE_DEFINITIONS (= asdf (ARRAY (STRING a) (STRING b) (STRING c) (STRING d))))) (COMMAND (STRING echo) (STRING (VAR_REF (asdf 3)))) (COMMAND (VARIABLE_DEFINITIONS (= foo (ARRAY (STRING (COMMAND_SUB `echo 6`)) (STRING b) (STRING c) (STRING d))))) (COMMAND (VARIABLE_DEFINITIONS (= (arr (VAR_REF foo)) (STRING 3))
95 )) (COMMAND (VARIABLE_DEFINITIONS (= bar (ARRAY (STRING a) (STRING b) (= 5 (STRING c)))))))))) (COMMAND (STRING echo) (STRING (BRACE_EXP (STRING a) (STRING b)))) (COMMAND (STRING echo) (STRING (BRACE_EXP (.. a d)))) (COMMAND (STRING echo) (STRING (BRACE_EXP (STRING (BRACE_EXP (STRING a) (STRING b))) (STRING c) (STRING d)))) (COMMAND (STRING echo) (STRING a (BRACE_EXP (STRING b) (STRING c)))) (COMMAND (STRING (COMMAND_SUB $(echo foobar)))) (| (COMMAND (STRING ls)) (COMMAND (STRING grep) (STRING gunit) (REDIR >> (STRING filelist)))) (COMMAND (case (STRING (COMMAND_SUB `echo asdf`)) (CASE_PATTERN (BRANCH gz) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING yay)))) (CASE_PATTERN (BRANCH bzip) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING three)))) (CASE_PATTERN (BRANCH MATCH_ALL) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING woo)))))) (COMMAND (for each (STRING (COMMAND_SUB `ls |grep log`)) (LIST (COMMAND (STRING echo) (STRING (VAR_REF each))) (COMMAND (STRING cat) (STR
96 ING each))))) (COMMAND (CFOR (FOR_INIT (+ 5 3)) (FOR_COND (+ 6 2)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 3 1)))) (COMMAND (select each (STRING (COMMAND_SUB `ls |grep output`)) (LIST (COMMAND (STRING echo) (STRING asdf) (REDIR 2 > (STRING / dev / null)))))) (COMMAND (IF_STATEMENT (if (LIST (COMMAND (STRING echo) (STRING yay2))) (LIST (COMMAND (STRING echo) (STRING yay)))))) (COMMAND (until (LIST (COMMAND (COMPOUND_COND (KEYWORD_TEST (a (STRING this / is . afile)))))) (LIST (COMMAND (STRING touch) (STRING this / is . afile))))) (COMMAND (while (LIST (COMMAND (COMPOUND_COND (BUILTIN_TEST (n (STRING foobar)))))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING file found)))))) (COMMAND (IF_STATEMENT (if (LIST (COMMAND (COMPOUND_COND (BUILTIN_TEST (eq (STRING 5) (STRING 6)))))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING something ' s wrong))))))) (COMMAND (STRING echo) (STRING this) (STRING command) (STRING has) (STRING multiple) (S
97 TRING arguments)) (COMMAND (STRING wc) (PROCESS_SUBSTITUTION < (LIST (COMMAND (STRING cat) (STRING / usr / share / dict / linux . words))))) (|| (&& (&& (&& (COMMAND (STRING cd) (STRING build)) (COMMAND (STRING . / configure))) (COMMAND (STRING make))) (COMMAND (STRING make_install))) (COMMAND (STRING echo) (STRING fail))) (COMMAND (STRING cd) (STRING / usr / bin)) (| (COMMAND (STRING ls) (STRING - al)) (COMMAND (STRING grep) (STRING more))) (COMMAND (VARIABLE_DEFINITIONS (= asdf (STRING parameters)))) (COMMAND (STRING (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING foo))))) (COMMAND (STRING (VAR_REF (OFFSET asdf 8)))) (COMMAND (STRING (VAR_REF (! asdf *)))) (COMMAND (STRING (VAR_REF (! asdf @)))) (COMMAND (STRING (VAR_REF (# foo)))) (COMMAND (STRING (VAR_REF (REPLACE_FIRST replaice (STRING with) (STRING pattern))))) (COMMAND (STRING (VAR_REF (LAZY_REMOVE_AT_START asdf (STRING bar))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_START asdf (STRING bar))))) (COMMAND (STRING (
98 VAR_REF (LAZY_REMOVE_AT_END asdf (STRING bar))))) (COMMAND (STRING (VAR_REF (LAZY_REMOVE_AT_END asdf (STRING bar))))) (COMMAND (STRING (VAR_REF 1)) (STRING (VAR_REF @)) (STRING (VAR_REF *))) (COMMAND (STRING (VAR_REF ?))) (COMMAND (STRING (VAR_REF (REPLACE_ALL PV (STRING .) (STRING _))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_START PV (STRING foo) (STRING bar))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_END PV (STRING foo) (STRING bar))))) (COMMAND (VARIABLE_DEFINITIONS (= MY_PN (STRING (VAR_REF (REPLACE_FIRST PN (STRING asterisk -))))))) (| (COMMAND (STRING cat) (STRING asdf)) (COMMAND (STRING grep) (STRING three) (REDIR 2 >& (FILE_DESCRIPTOR 1)) (REDIR > (STRING / dev / null)))) (COMMAND (STRING echo) (STRING asdf) (REDIR >> (STRING APPEND))) (COMMAND (STRING echo) (STRING cat) (<<< (STRING word))))
99 +(LIST (COMMAND (FUNCTION (STRING lots_o_echo) (CURRENT_SHELL (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING The number of tests that have failed : (VAR_REF failedtests)))) (COMMAND (STRING echo) (STRING (SINGLE_QUOTED_STRING '$failedtests'))) (COMMAND (STRING echo) (STRING (VAR_REF failedtests))))))) (COMMAND (FUNCTION (STRING do_some_arith) (CURRENT_SHELL (LIST (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (* 5 4)))) (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (** 5 4)))) (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (+ (VAR_REF failedtests) (/ 5 4))))) (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (+ (VAR_REF z) (MINUS_SIGN 3))))))))) (COMMAND (FUNCTION (STRING arrays) (SUBSHELL (LIST (COMMAND (VARIABLE_DEFINITIONS (= asdf (ARRAY (STRING a) (STRING b) (STRING c) (STRING d))))) (COMMAND (STRING echo) (STRING (VAR_REF (asdf (ARITHMETIC 3))))) (COMMAND (VARIABLE_DEFINITIONS (= foo (ARRAY (STRING (COMMAND_SUB `echo 6`)) (STRING b) (STRING c) (STRING d)))))
100 (COMMAND (VARIABLE_DEFINITIONS (= (arr (ARITHMETIC (VAR_REF foo))) (STRING 3)))) (COMMAND (VARIABLE_DEFINITIONS (= bar (ARRAY (STRING a) (STRING b) (= (ARITHMETIC 5) (STRING c)))))))))) (COMMAND (STRING echo) (STRING (BRACE_EXP (STRING a) (STRING b)))) (COMMAND (STRING echo) (STRING (BRACE_EXP (.. a d)))) (COMMAND (STRING echo) (STRING (BRACE_EXP (STRING (BRACE_EXP (STRING a) (STRING b))) (STRING c) (STRING d)))) (COMMAND (STRING echo) (STRING a (BRACE_EXP (STRING b) (STRING c)))) (COMMAND (STRING (COMMAND_SUB $(echo foobar)))) (| (COMMAND (STRING ls)) (COMMAND (STRING grep) (STRING gunit) (REDIR >> (STRING filelist)))) (COMMAND (case (STRING (COMMAND_SUB `echo asdf`)) (CASE_PATTERN (BRANCH gz) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING yay)))) (CASE_PATTERN (BRANCH bzip) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING three)))) (CASE_PATTERN (BRANCH MATCH_ALL) CASE_COMMAND (LIST (COMMAND (STRING echo) (STRING woo)))))) (COMMAND (for each (STRING (COMMAND_SUB `ls |g
101 rep log`)) (LIST (COMMAND (STRING echo) (STRING (VAR_REF each))) (COMMAND (STRING cat) (STRING each))))) (COMMAND (CFOR (FOR_INIT (ARITHMETIC (+ 5 3))) (FOR_COND (ARITHMETIC (+ 6 2))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 3 1))))) (COMMAND (select each (STRING (COMMAND_SUB `ls |grep output`)) (LIST (COMMAND (STRING echo) (STRING asdf) (REDIR 2 > (STRING / dev / null)))))) (COMMAND (IF_STATEMENT (if (LIST (COMMAND (STRING echo) (STRING yay2))) (LIST (COMMAND (STRING echo) (STRING yay)))))) (COMMAND (until (LIST (COMMAND (COMPOUND_COND (KEYWORD_TEST (a (STRING this / is . afile)))))) (LIST (COMMAND (STRING touch) (STRING this / is . afile))))) (COMMAND (while (LIST (COMMAND (COMPOUND_COND (BUILTIN_TEST (n (STRING foobar)))))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING file found)))))) (COMMAND (IF_STATEMENT (if (LIST (COMMAND (COMPOUND_COND (BUILTIN_TEST (eq (STRING 5) (STRING 6)))))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_
102 QUOTED_STRING something ' s wrong))))))) (COMMAND (STRING echo) (STRING this) (STRING command) (STRING has) (STRING multiple) (STRING arguments)) (COMMAND (STRING wc) (PROCESS_SUBSTITUTION < (LIST (COMMAND (STRING cat) (STRING / usr / share / dict / linux . words))))) (|| (&& (&& (&& (COMMAND (STRING cd) (STRING build)) (COMMAND (STRING . / configure))) (COMMAND (STRING make))) (COMMAND (STRING make_install))) (COMMAND (STRING echo) (STRING fail))) (COMMAND (STRING cd) (STRING / usr / bin)) (| (COMMAND (STRING ls) (STRING - al)) (COMMAND (STRING grep) (STRING more))) (COMMAND (VARIABLE_DEFINITIONS (= asdf (STRING parameters)))) (COMMAND (STRING (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING foo))))) (COMMAND (STRING (VAR_REF (OFFSET asdf (OFFSET (ARITHMETIC 8)))))) (COMMAND (STRING (VAR_REF (! asdf *)))) (COMMAND (STRING (VAR_REF (! asdf @)))) (COMMAND (STRING (VAR_REF (# foo)))) (COMMAND (STRING (VAR_REF (REPLACE_FIRST replaice (STRING with) (STRING pattern))))) (C
103 OMMAND (STRING (VAR_REF (LAZY_REMOVE_AT_START asdf (STRING bar))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_START asdf (STRING bar))))) (COMMAND (STRING (VAR_REF (LAZY_REMOVE_AT_END asdf (STRING bar))))) (COMMAND (STRING (VAR_REF (LAZY_REMOVE_AT_END asdf (STRING bar))))) (COMMAND (STRING (VAR_REF 1)) (STRING (VAR_REF @)) (STRING (VAR_REF *))) (COMMAND (STRING (VAR_REF ?))) (COMMAND (STRING (VAR_REF (REPLACE_ALL PV (STRING .) (STRING _))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_START PV (STRING foo) (STRING bar))))) (COMMAND (STRING (VAR_REF (REPLACE_AT_END PV (STRING foo) (STRING bar))))) (COMMAND (VARIABLE_DEFINITIONS (= MY_PN (STRING (VAR_REF (REPLACE_FIRST PN (STRING asterisk -))))))) (| (COMMAND (STRING cat) (STRING asdf)) (COMMAND (STRING grep) (STRING three) (REDIR 2 >& (FILE_DESCRIPTOR 1)) (REDIR > (STRING / dev / null)))) (COMMAND (STRING echo) (STRING asdf) (REDIR >> (STRING APPEND))) (COMMAND (STRING echo) (STRING cat) (<<< (STRING word))))
104
105 diff --git a/bashast/features_script/features.sh.walker.tokens b/bashast/features_script/features.sh.walker.tokens
106 index 7082afd..8b92d49 100644
107 --- a/bashast/features_script/features.sh.walker.tokens
108 +++ b/bashast/features_script/features.sh.walker.tokens
109 @@ -1,2 +1,2 @@
110 -LIST DOWN COMMAND DOWN FUNCTION DOWN STRING DOWN NAME UP CURRENT_SHELL DOWN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME COLON BLANK VAR_REF DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN SINGLE_QUOTED_STRING DOWN SINGLE_QUOTED_STRING_TOKEN UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME UP UP UP UP UP UP UP COMMAND DOWN FUNCTION DOWN STRING DOWN NAME UP CURRENT_SHELL DOWN LIST DOWN COMMAND DOWN ARITHMETIC_EXPRESSION DOWN TIMES DOWN DIGIT DIGIT UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN EXP DOWN DIGIT DIGIT UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN PLUS DOWN VAR_REF DOWN NAME UP SLASH DOWN DIGIT DIGIT UP UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN PLUS DOWN VAR_REF DOWN LETTER UP MINUS_SIGN DOWN DIGIT UP UP UP UP UP UP UP UP COMMAND DOWN FUNCTION DOWN STRING DOWN NAME UP SUBSHELL DOWN LIST DOWN COMMAND DOWN V
111 ARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME DOWN DIGIT UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME DOWN VAR_REF DOWN NAME UP UP STRING DOWN DIGIT UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP EQUALS DOWN DIGIT STRING DOWN LETTER UP UP UP UP UP UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN BRACE_EXP DOWN DOTDOT DOWN LETTER LETTER UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING
112 DOWN BRACE_EXP DOWN STRING DOWN BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN LETTER BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMAND DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_PAREN UP UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN OP STRING DOWN NAME UP UP UP UP COMMAND DOWN CASE DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP CASE_PATTERN DOWN BRANCH DOWN NAME UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP CASE_PATTERN DOWN BRANCH DOWN NAME UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP CASE_PATTERN DOWN BRANCH DOWN MATCH_ALL UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP UP COMMAND DOWN FOR DOWN NAME STRING D
113 OWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN CFOR DOWN FOR_INIT DOWN PLUS DOWN DIGIT DIGIT UP UP FOR_COND DOWN PLUS DOWN DIGIT DIGIT UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP FOR_MOD DOWN PLUS DOWN DIGIT DIGIT UP UP UP UP COMMAND DOWN SELECT DOWN NAME STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN DIGIT GREATER_THAN STRING DOWN SLASH NAME SLASH NAME UP UP UP UP UP UP COMMAND DOWN IF_STATEMENT DOWN IF DOWN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP UP COMMAND DOWN UNTIL DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN KEYWORD_TEST DOWN LETTER DOWN STRING DOWN NAME SLASH NAME DOT NAME UP UP UP UP
114 UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME SLASH NAME DOT NAME UP UP UP UP UP COMMAND DOWN WHILE DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN BUILTIN_TEST DOWN LETTER DOWN STRING DOWN NAME UP UP UP UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME BLANK NAME UP UP UP UP UP UP COMMAND DOWN IF_STATEMENT DOWN IF DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN BUILTIN_TEST DOWN NAME DOWN STRING DOWN DIGIT UP STRING DOWN DIGIT UP UP UP UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME SQUOTE LETTER BLANK NAME UP UP UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN NAME UP PROCESS_SUBSTITUTION DOWN LESS_THAN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN SLASH NAME SLASH NAME SLASH NAME SLASH NAME DOT NAME UP UP UP UP UP LOGICOR DOWN LO
115 GICAND DOWN LOGICAND DOWN LOGICAND DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN DOT SLASH NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN SLASH NAME SLASH NAME UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN MINUS NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME STRING DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN USE_DEFAULT_WHEN_UNSET_OR_NULL DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN OFFSET DOWN NAME DIGIT UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN BANG DOWN NAME TIMES UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN BANG DOWN NAME AT UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN POUND DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN VAR_
116 REF DOWN REPLACE_FIRST DOWN NAME STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_START DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_START DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_END DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_END DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN DIGIT UP UP STRING DOWN VAR_REF DOWN AT UP UP STRING DOWN VAR_REF DOWN TIMES UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN QMARK UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_ALL DOWN NAME STRING DOWN DOT UP STRING DOWN UNDERSCORE UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_START DOWN NAME STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_END DOWN NAME STRING DOWN NAME UP STRING DOWN NA
117 ME UP UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME STRING DOWN VAR_REF DOWN REPLACE_FIRST DOWN NAME STRING DOWN NAME MINUS UP UP UP UP UP UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN DIGIT OP FILE_DESCRIPTOR DOWN DIGIT UP UP REDIR DOWN GREATER_THAN STRING DOWN SLASH NAME SLASH NAME UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN OP STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP HERE_STRING_OP DOWN BLANK STRING DOWN NAME UP UP UP UP
118 +LIST DOWN COMMAND DOWN FUNCTION DOWN STRING DOWN NAME UP CURRENT_SHELL DOWN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME BLANK NAME COLON BLANK VAR_REF DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN SINGLE_QUOTED_STRING DOWN SINGLE_QUOTED_STRING_TOKEN UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME UP UP UP UP UP UP UP COMMAND DOWN FUNCTION DOWN STRING DOWN NAME UP CURRENT_SHELL DOWN LIST DOWN COMMAND DOWN ARITHMETIC_EXPRESSION DOWN ARITHMETIC DOWN TIMES DOWN DIGIT DIGIT UP UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN ARITHMETIC DOWN EXP DOWN DIGIT DIGIT UP UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN ARITHMETIC DOWN PLUS DOWN VAR_REF DOWN NAME UP SLASH DOWN DIGIT DIGIT UP UP UP UP UP COMMAND DOWN ARITHMETIC_EXPRESSION DOWN ARITHMETIC DOWN PLUS DOWN VAR_REF DOWN LETTER UP MINUS_SIGN DOWN DIGIT UP UP UP UP UP UP UP UP UP COMMAND D
119 OWN FUNCTION DOWN STRING DOWN NAME UP SUBSHELL DOWN LIST DOWN COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME DOWN ARITHMETIC DOWN DIGIT UP UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP STRING DOWN LETTER UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME DOWN ARITHMETIC DOWN VAR_REF DOWN NAME UP UP UP STRING DOWN DIGIT UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME ARRAY DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP EQUALS DOWN ARITHMETIC DOWN DIGIT UP STRING DOWN LETTER UP UP UP UP UP UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMA
120 ND DOWN STRING DOWN NAME UP STRING DOWN BRACE_EXP DOWN DOTDOT DOWN LETTER LETTER UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN BRACE_EXP DOWN STRING DOWN BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN LETTER BRACE_EXP DOWN STRING DOWN LETTER UP STRING DOWN LETTER UP UP UP UP COMMAND DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_PAREN UP UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN OP STRING DOWN NAME UP UP UP UP COMMAND DOWN CASE DOWN STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP CASE_PATTERN DOWN BRANCH DOWN NAME UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP CASE_PATTERN DOWN BRANCH DOWN NAME UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP CASE_PATTERN DOWN BRANCH DOWN MATCH_
121 ALL UP CASE_COMMAND LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP UP COMMAND DOWN FOR DOWN NAME STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN VAR_REF DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN CFOR DOWN FOR_INIT DOWN ARITHMETIC DOWN PLUS DOWN DIGIT DIGIT UP UP UP FOR_COND DOWN ARITHMETIC DOWN PLUS DOWN DIGIT DIGIT UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP FOR_MOD DOWN ARITHMETIC DOWN PLUS DOWN DIGIT DIGIT UP UP UP UP UP COMMAND DOWN SELECT DOWN NAME STRING DOWN COMMAND_SUB DOWN COMMAND_SUBSTITUTION_TICK UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN DIGIT GREATER_THAN STRING DOWN SLASH NAME SLASH NAME UP UP UP UP UP UP COMMAND DOWN IF_STATEMENT DOWN IF DOWN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP LIST DOWN COMMAND DOWN STRING DO
122 WN NAME UP STRING DOWN NAME UP UP UP UP UP UP COMMAND DOWN UNTIL DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN KEYWORD_TEST DOWN LETTER DOWN STRING DOWN NAME SLASH NAME DOT NAME UP UP UP UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME SLASH NAME DOT NAME UP UP UP UP UP COMMAND DOWN WHILE DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN BUILTIN_TEST DOWN LETTER DOWN STRING DOWN NAME UP UP UP UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME BLANK NAME UP UP UP UP UP UP COMMAND DOWN IF_STATEMENT DOWN IF DOWN LIST DOWN COMMAND DOWN COMPOUND_COND DOWN BUILTIN_TEST DOWN NAME DOWN STRING DOWN DIGIT UP STRING DOWN DIGIT UP UP UP UP UP UP LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN DOUBLE_QUOTED_STRING DOWN NAME SQUOTE LETTER BLANK NAME UP UP UP UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRI
123 NG DOWN NAME UP PROCESS_SUBSTITUTION DOWN LESS_THAN LIST DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN SLASH NAME SLASH NAME SLASH NAME SLASH NAME DOT NAME UP UP UP UP UP LOGICOR DOWN LOGICAND DOWN LOGICAND DOWN LOGICAND DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN DOT SLASH NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN SLASH NAME SLASH NAME UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN MINUS NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME STRING DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN USE_DEFAULT_WHEN_UNSET_OR_NULL DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN OFFSET DOWN NAME OFFSET DOWN ARITHMETIC DOWN DIGIT UP UP UP UP UP UP COMMAND DO
124 WN STRING DOWN VAR_REF DOWN BANG DOWN NAME TIMES UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN BANG DOWN NAME AT UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN POUND DOWN NAME UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_FIRST DOWN NAME STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_START DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_START DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_END DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN LAZY_REMOVE_AT_END DOWN NAME STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN DIGIT UP UP STRING DOWN VAR_REF DOWN AT UP UP STRING DOWN VAR_REF DOWN TIMES UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN QMARK UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_ALL DOWN NAME STRING DOWN DOT UP STRING DOWN UNDERSCORE UP UP
125 UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_START DOWN NAME STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN STRING DOWN VAR_REF DOWN REPLACE_AT_END DOWN NAME STRING DOWN NAME UP STRING DOWN NAME UP UP UP UP UP COMMAND DOWN VARIABLE_DEFINITIONS DOWN EQUALS DOWN NAME STRING DOWN VAR_REF DOWN REPLACE_FIRST DOWN NAME STRING DOWN NAME MINUS UP UP UP UP UP UP UP PIPE DOWN COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN DIGIT OP FILE_DESCRIPTOR DOWN DIGIT UP UP REDIR DOWN GREATER_THAN STRING DOWN SLASH NAME SLASH NAME UP UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP REDIR DOWN OP STRING DOWN NAME UP UP UP COMMAND DOWN STRING DOWN NAME UP STRING DOWN NAME UP HERE_STRING_OP DOWN BLANK STRING DOWN NAME UP UP UP UP
126
127
128 diff --git a/bashast/gunit/arith_main.gunit b/bashast/gunit/arith_main.gunit
129 index 7e04dc3..5e33c87 100644
130 --- a/bashast/gunit/arith_main.gunit
131 +++ b/bashast/gunit/arith_main.gunit
132 @@ -23,117 +23,118 @@ gunit java_libbash;
133
134 arithmetics_test:
135 //primary:
136 -"3" -> "3"
137 -"foo" -> (VAR_REF foo)
138 -"foo[1]" -> (VAR_REF (foo 1))
139 +"3" -> (ARITHMETIC 3)
140 +"foo" -> (ARITHMETIC (VAR_REF foo))
141 +"foo[1]" -> (ARITHMETIC (VAR_REF (foo (ARITHMETIC 1))))
142
143 //unary:
144 -"3" -> "3"
145 -"b--" -> (POST_DECR (VAR_REF b))
146 -"i++" -> (POST_INCR (VAR_REF i))
147 +"3" -> (ARITHMETIC 3)
148 +"b--" -> (ARITHMETIC (POST_DECR (VAR_REF b)))
149 +"i++" -> (ARITHMETIC (POST_INCR (VAR_REF i)))
150
151 //pre_inc_dec:
152 -"++i" -> (PRE_INCR (VAR_REF i))
153 -"--b" -> (PRE_DECR (VAR_REF b))
154 +"++i" -> (ARITHMETIC (PRE_INCR (VAR_REF i)))
155 +"--b" -> (ARITHMETIC (PRE_DECR (VAR_REF b)))
156
157 //unary:
158 -"6" -> "6"
159 -"+9" -> (PLUS_SIGN 9)
160 -"-15" -> (MINUS_SIGN 15)
161 -"++ z" -> (PRE_INCR (VAR_REF z))
162 -"f--" -> (POST_DECR (VAR_REF f))
163 -"~8" -> (~ 8)
164 -"!8" -> (! 8)
165 -"!!8" -> (! (! 8))
166 -"--8" -> (PRE_DECR 8)
167 +"6" -> (ARITHMETIC 6)
168 +"+9" -> (ARITHMETIC (PLUS_SIGN 9))
169 +"-15" -> (ARITHMETIC (MINUS_SIGN 15))
170 +"++ z" -> (ARITHMETIC (PRE_INCR (VAR_REF z)))
171 +"f--" -> (ARITHMETIC (POST_DECR (VAR_REF f)))
172 +"~8" -> (ARITHMETIC (~ 8))
173 +"!8" -> (ARITHMETIC (! 8))
174 +"!!8" -> (ARITHMETIC (! (! 8)))
175 +"--8" -> (ARITHMETIC (PRE_DECR 8))
176
177 //exponential:
178 -"8" -> "8"
179 -"6**2" -> (** 6 2)
180 -"-5**+4" -> (** (MINUS_SIGN 5) (PLUS_SIGN 4))
181 +"8" -> (ARITHMETIC 8)
182 +"6**2" -> (ARITHMETIC (** 6 2))
183 +"-5**+4" -> (ARITHMETIC (** (MINUS_SIGN 5) (PLUS_SIGN 4)))
184
185 //times_division_modulus:
186 -"9" -> "9"
187 -"7 * 9" -> (* 7 9)
188 -"7 / 9" -> (/ 7 9)
189 -"7 % 9" -> (% 7 9)
190 -"6*4*3" -> (* (* 6 4) 3)
191 -"6*4/3" -> (/ (* 6 4) 3)
192 -"6%4*3" -> (* (% 6 4) 3)
193 -"7/3**6" -> (/ 7 (** 3 6))
194 -"7/-3**6" -> (/ 7 (** (MINUS_SIGN 3) 6))
195 +"9" -> (ARITHMETIC 9)
196 +"7 * 9" -> (ARITHMETIC (* 7 9))
197 +"7 / 9" -> (ARITHMETIC (/ 7 9))
198 +"7 % 9" -> (ARITHMETIC (% 7 9))
199 +"6*4*3" -> (ARITHMETIC (* (* 6 4) 3))
200 +"6*4/3" -> (ARITHMETIC (/ (* 6 4) 3))
201 +"6%4*3" -> (ARITHMETIC (* (% 6 4) 3))
202 +"7/3**6" -> (ARITHMETIC (/ 7 (** 3 6)))
203 +"7/-3**6" -> (ARITHMETIC (/ 7 (** (MINUS_SIGN 3) 6)))
204
205 //addsub:
206 -"10" -> "10"
207 -"9+27" -> (+ 9 27)
208 -"9-27" -> (- 9 27)
209 -"9-27+8" -> (+ (- 9 27) 8)
210 -"9-35*-2" -> (- 9 (* 35 (MINUS_SIGN 2)))
211 -"9*5+2" -> (+ (* 9 5) 2)
212 +"10" -> (ARITHMETIC 10)
213 +"9+27" -> (ARITHMETIC (+ 9 27))
214 +"9-27" -> (ARITHMETIC (- 9 27))
215 +"9-27+8" -> (ARITHMETIC (+ (- 9 27) 8))
216 +"9-35*-2" -> (ARITHMETIC (- 9 (* 35 (MINUS_SIGN 2))))
217 +"9*5+2" -> (ARITHMETIC (+ (* 9 5) 2))
218
219 //shifts:
220 -"16" -> "16"
221 -"16+2>>3" -> (>> (+ 16 2) 3)
222 -"16+2<<3" -> (<< (+ 16 2) 3)
223 +"16" -> (ARITHMETIC 16)
224 +"16+2>>3" -> (ARITHMETIC (>> (+ 16 2) 3))
225 +"16+2<<3" -> (ARITHMETIC (<< (+ 16 2) 3))
226
227 //compare:
228 -"17" ->"17"
229 -"19<20" -> (< 19 20)
230 -"19!=20" -> (NOT_EQUALS 19 20)
231 -"19==20" -> (EQUALS_TO 19 20)
232 +"17" ->(ARITHMETIC 17)
233 +"19<20" -> (ARITHMETIC (< 19 20))
234 +"19!=20" -> (ARITHMETIC (NOT_EQUALS 19 20))
235 +"19==20" -> (ARITHMETIC (EQUALS_TO 19 20))
236
237 //bitwiseand:
238 -"17" -> "17"
239 -"17 & 15" -> (& 17 15)
240 +"17" -> (ARITHMETIC 17)
241 +"17 & 15" -> (ARITHMETIC (& 17 15))
242
243 //bitwisexor:
244 -"17" -> "17"
245 -"17 ^ 15" -> (^ 17 15)
246 +"17" -> (ARITHMETIC 17)
247 +"17 ^ 15" -> (ARITHMETIC (^ 17 15))
248
249 //bitwiseor:
250 -"17" -> "17"
251 -"17 | 15" -> (| 17 15)
252 +"17" -> (ARITHMETIC 17)
253 +"17 | 15" -> (ARITHMETIC (| 17 15))
254
255 //logicand:
256 -"17" -> "17"
257 -"17 && 15" -> (&& 17 15)
258 +"17" -> (ARITHMETIC 17)
259 +"17 && 15" -> (ARITHMETIC (&& 17 15))
260
261 //logicor:
262 -"17" -> "17"
263 -"17 || 15" -> (|| 17 15)
264 +"17" -> (ARITHMETIC 17)
265 +"17 || 15" -> (ARITHMETIC (|| 17 15))
266
267 //arithmetic:
268 -"foo=5+3" -> (= foo (+ 5 3))
269 -"foo[5]=5+3" -> (= (foo 5) (+ 5 3))
270 -"${foo[5]}=3" -> (= (VAR_REF (VAR_REF (foo 5))) 3)
271 -"${foo[5]}*=3" -> (MUL_ASSIGN (VAR_REF (VAR_REF (foo 5))) 3)
272 -"${foo[5]}^=3" -> (XOR_ASSIGN (VAR_REF (VAR_REF (foo 5))) 3)
273 -"var *= 5" -> (MUL_ASSIGN var 5)
274 -"var /= 5" -> (DIVIDE_ASSIGN var 5)
275 -"var %= 5" -> (MOD_ASSIGN var 5)
276 -"asdf += 5" -> (PLUS_ASSIGN asdf 5)
277 -"var -= 5" -> (MINUS_ASSIGN var 5)
278 -"var <<= 5" -> (LSHIFT_ASSIGN var 5)
279 -"var >>= 5" -> (RSHIFT_ASSIGN var 5)
280 -"var &= 5" -> (AND_ASSIGN var 5)
281 -"var ^= 5" -> (XOR_ASSIGN var 5)
282 -"var |= 5" -> (OR_ASSIGN var 5)
283 +"foo=5+3" -> (ARITHMETIC (= foo (+ 5 3)))
284 +"foo[5]=5+3" -> (ARITHMETIC (= (foo (ARITHMETIC 5)) (+ 5 3)))
285 +"${foo[5]}=3" -> (ARITHMETIC (= (VAR_REF (VAR_REF (foo (ARITHMETIC 5)))) 3))
286 +"${foo[5]}*=3" -> (ARITHMETIC (MUL_ASSIGN (VAR_REF (VAR_REF (foo (ARITHMETIC 5)))) 3))
287 +"${foo[5]}^=3" -> (ARITHMETIC (XOR_ASSIGN (VAR_REF (VAR_REF (foo (ARITHMETIC 5)))) 3))
288 +"var *= 5" -> (ARITHMETIC (MUL_ASSIGN var 5))
289 +"var /= 5" -> (ARITHMETIC (DIVIDE_ASSIGN var 5))
290 +"var %= 5" -> (ARITHMETIC (MOD_ASSIGN var 5))
291 +"asdf += 5" -> (ARITHMETIC (PLUS_ASSIGN asdf 5))
292 +"var -= 5" -> (ARITHMETIC (MINUS_ASSIGN var 5))
293 +"var <<= 5" -> (ARITHMETIC (LSHIFT_ASSIGN var 5))
294 +"var >>= 5" -> (ARITHMETIC (RSHIFT_ASSIGN var 5))
295 +"var &= 5" -> (ARITHMETIC (AND_ASSIGN var 5))
296 +"var ^= 5" -> (ARITHMETIC (XOR_ASSIGN var 5))
297 +"var |= 5" -> (ARITHMETIC (OR_ASSIGN var 5))
298 "3=7" FAIL
299
300 -"13"->"13"
301 -"5?7:2"->(ARITHMETIC_CONDITION 5 7 2)
302 -"(4-3)?0:1"->(ARITHMETIC_CONDITION (- 4 3) 0 1)
303 +"13"->(ARITHMETIC 13)
304 +"5?7:2"->(ARITHMETIC (ARITHMETIC_CONDITION 5 7 2))
305 +"(4-3)?0:1"-> (ARITHMETIC (ARITHMETIC_CONDITION (ARITHMETIC (- 4 3)) 0 1))
306 +"(4-3)?(0,2):1"-> (ARITHMETIC (ARITHMETIC_CONDITION (ARITHMETIC (- 4 3)) (ARITHMETIC 0) (ARITHMETIC 2) 1))
307
308 //arithmetics:
309 -"~ 10" -> (~ 10)
310 +"~ 10" -> (ARITHMETIC (~ 10))
311
312 arithmetic_expansion:
313 -"$((5+4, 3+2, a*b))" -> (ARITHMETIC_EXPRESSION (+ 5 4) (+ 3 2) (* (VAR_REF a) (VAR_REF b)))
314 -"$[1]" -> (ARITHMETIC_EXPRESSION 1)
315 -"$(($((1))))" -> (ARITHMETIC_EXPRESSION (ARITHMETIC_EXPRESSION 1))
316 +"$((5+4, 3+2, a*b))" -> (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 5 4)) (ARITHMETIC (+ 3 2)) (ARITHMETIC (* (VAR_REF a) (VAR_REF b))))
317 +"$[1]" -> (ARITHMETIC_EXPRESSION (ARITHMETIC 1))
318 +"$(($((1))))" -> (ARITHMETIC_EXPRESSION (ARITHMETIC (ARITHMETIC_EXPRESSION (ARITHMETIC 1))))
319
320 start:
321 -"echo $(( 3 + 2 ))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (+ 3 2)))))
322 -"echo $((++i))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (PRE_INCR (VAR_REF i))))))
323 -"echo $(( ++i ))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (PRE_INCR (VAR_REF i))))))
324 -"echo \"The solution is: $(( 3+2 ))\""-> (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING The solution is : (ARITHMETIC_EXPRESSION (+ 3 2))))))
325 +"echo $(( 3 + 2 ))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 3 2))))))
326 +"echo $((++i))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (ARITHMETIC (PRE_INCR (VAR_REF i)))))))
327 +"echo $(( ++i ))" -> (LIST (COMMAND (STRING echo) (STRING (ARITHMETIC_EXPRESSION (ARITHMETIC (PRE_INCR (VAR_REF i)))))))
328 +"echo \"The solution is: $(( 3+2 ))\""-> (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING The solution is : (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 3 2)))))))
329
330 diff --git a/bashast/gunit/array.gunit b/bashast/gunit/array.gunit
331 index 514eb53..ddfdfeb 100644
332 --- a/bashast/gunit/array.gunit
333 +++ b/bashast/gunit/array.gunit
334 @@ -36,22 +36,22 @@ builtin_variable_definitions:
335
336 variable_reference:
337 "$asdf" -> (VAR_REF asdf)
338 -"${asdf[0]:-default}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL (asdf 0) (STRING default)))
339 -"${asdf[3]}" -> (VAR_REF (asdf 3))
340 -"${asdf[4] }" -> (VAR_REF (asdf 4))
341 -"${asdf[i*2]}" -> (VAR_REF (asdf (* (VAR_REF i) 2)))
342 -"${asdf[1]:2:2}" -> (VAR_REF (OFFSET (asdf 1) 2 2))
343 -"${asdf[2]##word}" -> (VAR_REF (REPLACE_AT_START (asdf 2) (STRING word)))
344 -"${asdf[3]%%word}" -> (VAR_REF (REPLACE_AT_END (asdf 3) (STRING word)))
345 -"${asdf[4]//pattern}" -> (VAR_REF (REPLACE_ALL (asdf 4) (STRING pattern)))
346 +"${asdf[0]:-default}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL (asdf (ARITHMETIC 0)) (STRING default)))
347 +"${asdf[3]}" -> (VAR_REF (asdf (ARITHMETIC 3)))
348 +"${asdf[4] }" -> (VAR_REF (asdf (ARITHMETIC 4)))
349 +"${asdf[i*2]}" -> (VAR_REF (asdf (ARITHMETIC (* (VAR_REF i) 2))))
350 +"${asdf[1]:2:2}" -> (VAR_REF (OFFSET (asdf (ARITHMETIC 1)) (OFFSET (ARITHMETIC 2)) (OFFSET (ARITHMETIC 2))))
351 +"${asdf[2]##word}" -> (VAR_REF (REPLACE_AT_START (asdf (ARITHMETIC 2)) (STRING word)))
352 +"${asdf[3]%%word}" -> (VAR_REF (REPLACE_AT_END (asdf (ARITHMETIC 3)) (STRING word)))
353 +"${asdf[4]//pattern}" -> (VAR_REF (REPLACE_ALL (asdf (ARITHMETIC 4)) (STRING pattern)))
354 "${asdf}" -> (VAR_REF asdf)
355 "${#asdf[0]}" -> (VAR_REF (# (asdf 0)))
356 -"${#asdf[ $i ]}" -> (VAR_REF (# (asdf (VAR_REF i))))
357 +"${#asdf[ $i ]}" -> (VAR_REF (# (asdf (ARITHMETIC (VAR_REF i)))))
358 "${asdf[@]}" -> (VAR_REF (ARRAY asdf @))
359 "${asdf[*]}" -> (VAR_REF (ARRAY asdf *))
360 "${#asdf[@]}" -> (VAR_REF (# (asdf ARRAY_SIZE)))
361 "${#asdf[*]}" -> (VAR_REF (# (asdf ARRAY_SIZE)))
362 -"${asdf[@]:0:1}" -> (VAR_REF (OFFSET (ARRAY asdf @) 0 1))
363 +"${asdf[@]:0:1}" -> (VAR_REF (OFFSET (ARRAY asdf @) (OFFSET (ARITHMETIC 0)) (OFFSET (ARITHMETIC 1))))
364 "${asdf[*]#path}" -> (VAR_REF (LAZY_REMOVE_AT_START (ARRAY asdf *) (STRING path)))
365 "${asdf[@]%word}" -> (VAR_REF (LAZY_REMOVE_AT_END (ARRAY asdf @) (STRING word)))
366 "${asdf[*]/pattern/string}" -> (VAR_REF (REPLACE_FIRST (ARRAY asdf *) (STRING pattern) (STRING string)))
367
368 diff --git a/bashast/gunit/assoc_array.gunit b/bashast/gunit/assoc_array.gunit
369 index ab58374..5af1c11 100644
370 --- a/bashast/gunit/assoc_array.gunit
371 +++ b/bashast/gunit/assoc_array.gunit
372 @@ -19,10 +19,10 @@
373 gunit java_libbash;
374
375 variable_definition_atom:
376 -"arr[foo]=\"asdf\"" -> (= (arr (VAR_REF foo)) (STRING (DOUBLE_QUOTED_STRING asdf)))
377 -"arr=(a b [4]=c)" -> (= arr (ARRAY (STRING a) (STRING b) (= 4 (STRING c))))
378 -"asdf[idx]=${var}" -> (= (asdf (VAR_REF idx)) (STRING (VAR_REF var)))
379 -"asdf[++i]=${var}" -> (= (asdf (PRE_INCR (VAR_REF i))) (STRING (VAR_REF var)))
380 -"asdf[++i,j]=${var}" -> (= (asdf (PRE_INCR (VAR_REF i)) (VAR_REF j)) (STRING (VAR_REF var)))
381 -"asdf[$((i))]=${var}" -> (= (asdf (VAR_REF i)) (STRING (VAR_REF var)))
382 +"arr[foo]=\"asdf\"" -> (= (arr (ARITHMETIC (VAR_REF foo))) (STRING (DOUBLE_QUOTED_STRING asdf)))
383 +"arr=(a b [4]=c)" -> (= arr (ARRAY (STRING a) (STRING b) (= (ARITHMETIC 4) (STRING c))))
384 +"asdf[idx]=${var}" -> (= (asdf (ARITHMETIC (VAR_REF idx))) (STRING (VAR_REF var)))
385 +"asdf[++i]=${var}" -> (= (asdf (ARITHMETIC (PRE_INCR (VAR_REF i)))) (STRING (VAR_REF var)))
386 +"asdf[++i,j]=${var}" -> (= (asdf (ARITHMETIC (PRE_INCR (VAR_REF i))) (ARITHMETIC (VAR_REF j))) (STRING (VAR_REF var)))
387 +"asdf[$((i))]=${var}" -> (= (asdf (ARITHMETIC (VAR_REF i))) (STRING (VAR_REF var)))
388 "asdf[1]=(a b c)" FAIL
389
390 diff --git a/bashast/gunit/compound.gunit b/bashast/gunit/compound.gunit
391 index c5d6845..f3ec44f 100644
392 --- a/bashast/gunit/compound.gunit
393 +++ b/bashast/gunit/compound.gunit
394 @@ -35,8 +35,8 @@ condition_comparison:
395 "[ asdf \> qwert ]" -> (COMPOUND_COND (BUILTIN_TEST (\> (STRING asdf) (STRING qwert))))
396
397 arithmetic_expression:
398 -"((5+3))" -> (ARITHMETIC_EXPRESSION (+ 5 3))
399 -"(( 5+3 ))" -> (ARITHMETIC_EXPRESSION (+ 5 3))
400 +"((5+3))" -> (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 5 3)))
401 +"(( 5+3, 2 ))" -> (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 5 3)) (ARITHMETIC 2))
402
403 current_shell:
404 "{ time cat; }" -> (CURRENT_SHELL (LIST (COMMAND (STRING cat) time)))
405 @@ -97,10 +97,10 @@ done" -> (for each (STRING (COMMAND_SUB `ls |grep log`)) (LIST (COMMAND (STRING
406 "for i in foo$var bar ; do echo $i; done" -> (for i (STRING foo (VAR_REF var)) (STRING bar) (LIST (COMMAND (STRING echo) (STRING (VAR_REF i)))))
407 "for each in `ls |grep log`; do echo file done" FAIL
408
409 -"for ((5+3;5+3;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (+ 5 3)) (FOR_COND (+ 5 3)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 5 3)))
410 -"for ((5+3; ;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (+ 5 3)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 5 3)))
411 -"for ((;5+3 ;5+3)); do echo yay; done" -> (CFOR (FOR_COND (+ 5 3)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 5 3)))
412 -"for ((5+3;;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (+ 5 3)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 5 3)))
413 +"for ((5+3,2;5+3;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (ARITHMETIC (+ 5 3)) (ARITHMETIC 2)) (FOR_COND (ARITHMETIC (+ 5 3))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 5 3))))
414 +"for ((5+3; ;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (ARITHMETIC (+ 5 3))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 5 3))))
415 +"for ((;5+3 ;5+3)); do echo yay; done" -> (CFOR (FOR_COND (ARITHMETIC (+ 5 3))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 5 3))))
416 +"for ((5+3;;5+3)); do echo yay; done" -> (CFOR (FOR_INIT (ARITHMETIC (+ 5 3))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 5 3))))
417
418 select_expr:
419 "select each in `ls |grep log`; do
420 @@ -143,7 +143,7 @@ while_expr:
421 echo \"file found\"
422 done" -> (while (LIST (COMMAND (STRING echo) (STRING true))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING file found)))))
423 "while echo true; do echo \"file found\"; done" -> (while (LIST (COMMAND (STRING echo) (STRING true))) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING file found)))))
424 -"while(( 1>0 )); do echo ok; done" -> (while (LIST (COMMAND (ARITHMETIC_EXPRESSION (> 1 0)))) (LIST (COMMAND (STRING echo) (STRING ok))))
425 +"while(( 1>0 )); do echo ok; done" -> (while (LIST (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (> 1 0))))) (LIST (COMMAND (STRING echo) (STRING ok))))
426 "while echo true`; do echo file done" FAIL
427 "while [[ -n \"$ver_str\" ]] ; do
428 echo true
429 @@ -186,12 +186,12 @@ esac" -> (case (STRING (DOUBLE_QUOTED_STRING (VAR_REF 1))) (CASE_PATTERN (BRANCH
430
431 command:
432 "[[ asdf > qwert ]] > /dev/null" -> (COMMAND (COMPOUND_COND (KEYWORD_TEST (> (STRING asdf) (STRING qwert)))) (REDIR > (STRING / dev / null)))
433 -"(( 5+3 )) > /dev/null" -> (COMMAND (ARITHMETIC_EXPRESSION (+ 5 3)) (REDIR > (STRING / dev / null)))
434 +"(( 5+3 )) > /dev/null" -> (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 5 3))) (REDIR > (STRING / dev / null)))
435 "{ time cat; } > /dev/null" -> (COMMAND (CURRENT_SHELL (LIST (COMMAND (STRING cat) time))) (REDIR > (STRING / dev / null)))
436 "(time cat) > /dev/null" -> (COMMAND (SUBSHELL (LIST (COMMAND (STRING cat) time))) (REDIR > (STRING / dev / null)))
437 "case a in esac >/dev/null" -> (COMMAND (case (STRING a) CASE_PATTERN) (REDIR > (STRING / dev / null)))
438 "for i in foo$var bar; do echo $i; done >/dev/null" -> (COMMAND (for i (STRING foo (VAR_REF var)) (STRING bar) (LIST (COMMAND (STRING echo) (STRING (VAR_REF i))))) (REDIR > (STRING / dev / null)))
439 -"for ((5+3;;5+3)); do echo yay; done >/dev/null" -> (COMMAND (CFOR (FOR_INIT (+ 5 3)) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (+ 5 3))) (REDIR > (STRING / dev / null)))
440 +"for ((5+3;;5+3)); do echo yay; done >/dev/null" -> (COMMAND (CFOR (FOR_INIT (ARITHMETIC (+ 5 3))) (LIST (COMMAND (STRING echo) (STRING yay))) (FOR_MOD (ARITHMETIC (+ 5 3)))) (REDIR > (STRING / dev / null)))
441 "select each in `ls |grep log`; do echo \"file found\"; done >/dev/null" -> (COMMAND (select each (STRING (COMMAND_SUB `ls |grep log`)) (LIST (COMMAND (STRING echo) (STRING (DOUBLE_QUOTED_STRING file found))))) (REDIR > (STRING / dev / null)))
442
443 "if echo yay2;
444
445 diff --git a/bashast/gunit/expansions.gunit b/bashast/gunit/expansions.gunit
446 index a1733e8..543012e 100644
447 --- a/bashast/gunit/expansions.gunit
448 +++ b/bashast/gunit/expansions.gunit
449 @@ -20,8 +20,8 @@ gunit java_libbash;
450
451 command_list:
452 "echo a{b,c,d}" -> (LIST (COMMAND (STRING echo) (STRING a (BRACE_EXP (STRING b) (STRING c) (STRING d)))))
453 -"((5+5))" -> (LIST (COMMAND (ARITHMETIC_EXPRESSION (+ 5 5))))
454 -"(( 4 + asdf ))" -> (LIST (COMMAND (ARITHMETIC_EXPRESSION (+ 4 (VAR_REF asdf)))))
455 +"((5+5))" -> (LIST (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 5 5)))))
456 +"(( 4 + asdf ))" -> (LIST (COMMAND (ARITHMETIC_EXPRESSION (ARITHMETIC (+ 4 (VAR_REF asdf))))))
457 "[[ while=while ]] && echo true" -> (LIST (&& (COMMAND (COMPOUND_COND (KEYWORD_TEST (STRING while = while)))) (COMMAND (STRING echo) (STRING true))))
458 "[[ while = while ]] && echo true" -> (LIST (&& (COMMAND (COMPOUND_COND (KEYWORD_TEST (= (STRING while) (STRING while))))) (COMMAND (STRING echo) (STRING true))))
459 "for each in `ls |grep output`; do
460 @@ -30,4 +30,4 @@ done" -> (LIST (COMMAND (for each (STRING (COMMAND_SUB `ls |grep output`)) (LIST
461 "wc <(cat /usr/share/dict/linux.words)" -> (LIST (COMMAND (STRING wc) (PROCESS_SUBSTITUTION < (LIST (COMMAND (STRING cat) (STRING / usr / share / dict / linux . words))))))
462
463 all_expansions:
464 -"abc $(ab) ${ab} $((ab)) `ab` \"ab\" 'ab'" -> (STRING abc (COMMAND_SUB $(ab)) (VAR_REF ab) (ARITHMETIC_EXPRESSION (VAR_REF ab)) (COMMAND_SUB `ab`) (DOUBLE_QUOTED_STRING ab) 'ab')
465 +"abc $(ab) ${ab} $((ab)) `ab` \"ab\" 'ab'" -> (STRING abc (COMMAND_SUB $(ab)) (VAR_REF ab) (ARITHMETIC_EXPRESSION (ARITHMETIC (VAR_REF ab))) (COMMAND_SUB `ab`) (DOUBLE_QUOTED_STRING ab) 'ab')
466
467 diff --git a/bashast/gunit/param_main.gunit b/bashast/gunit/param_main.gunit
468 index 422b7ac..4e30458 100644
469 --- a/bashast/gunit/param_main.gunit
470 +++ b/bashast/gunit/param_main.gunit
471 @@ -28,12 +28,13 @@ variable_reference:
472 "${asdf:-public_html}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING public_html)))
473 "${asdf='foo'}" -> (VAR_REF (ASSIGN_DEFAULT_WHEN_UNSET asdf (STRING 'foo')))
474 "${asdf:=}" -> (VAR_REF (ASSIGN_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING EMPTY_EXPANSION_VALUE)))
475 -"${bar:7}" -> (VAR_REF (OFFSET bar 7))
476 -"${bar: -10}" -> (VAR_REF (OFFSET bar (MINUS_SIGN 10)))
477 -"${bar:(-10 + 5)}" -> (VAR_REF (OFFSET bar (+ (MINUS_SIGN 10) 5)))
478 -"${foo:5:2}" -> (VAR_REF (OFFSET foo 5 2))
479 -"${foo::2}" -> (VAR_REF (OFFSET foo 0 2))
480 -"${foo:$((5)):$((2))}" -> (VAR_REF (OFFSET foo 5 2))
481 +"${bar:7}" -> (VAR_REF (OFFSET bar (OFFSET (ARITHMETIC 7))))
482 +"${bar: -10}" -> (VAR_REF (OFFSET bar (OFFSET (ARITHMETIC (MINUS_SIGN 10)))))
483 +"${bar:(-10 + 5)}" -> (VAR_REF (OFFSET bar (OFFSET (ARITHMETIC (ARITHMETIC (+ (MINUS_SIGN 10) 5))))))
484 +"${bar:(-10 + 5, 3)}" -> (VAR_REF (OFFSET bar (OFFSET (ARITHMETIC (ARITHMETIC (+ (MINUS_SIGN 10) 5)) (ARITHMETIC 3)))))
485 +"${foo:5:2}" -> (VAR_REF (OFFSET foo (OFFSET (ARITHMETIC 5)) (OFFSET (ARITHMETIC 2))))
486 +"${foo::2}" -> (VAR_REF (OFFSET foo (OFFSET 0) (OFFSET (ARITHMETIC 2))))
487 +"${foo:$((5)):$((2))}" -> (VAR_REF (OFFSET foo (OFFSET (ARITHMETIC 5)) (OFFSET (ARITHMETIC 2))))
488 "${!asdf*}" -> (VAR_REF (! asdf *))
489 "${!asdf@}" -> (VAR_REF (! asdf @))
490 "${!asdf[*]}" -> (VAR_REF (LIST_EXPAND asdf *))
491
492 diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
493 index 7c7afaf..9b2281d 100644
494 --- a/bashast/libbashWalker.g
495 +++ b/bashast/libbashWalker.g
496 @@ -506,16 +506,19 @@ var_expansion returns[std::string libbash_value]
497 libbash_value = walker->do_alternate_expansion(walker->is_unset($var_name.libbash_value),
498 libbash_word);
499 }
500 - |(^(OFFSET array_name arithmetics arithmetics)) => ^(OFFSET libbash_name=array_name offset=arithmetics length=arithmetics) {
501 + |(^(OFFSET array_name ^(OFFSET arithmetics) ^(OFFSET arithmetics))) =>
502 + ^(OFFSET libbash_name=array_name ^(OFFSET offset=arithmetics) ^(OFFSET length=arithmetics)) {
503 libbash_value = walker->do_subarray_expansion(libbash_name, offset, length);
504 }
505 - |(^(OFFSET array_name offset=arithmetics)) => ^(OFFSET libbash_name=array_name offset=arithmetics) {
506 + |(^(OFFSET array_name ^(OFFSET offset=arithmetics))) =>
507 + ^(OFFSET libbash_name=array_name ^(OFFSET offset=arithmetics)) {
508 libbash_value = walker->do_subarray_expansion(libbash_name, offset);
509 }
510 - |(^(OFFSET var_name arithmetics arithmetics)) => ^(OFFSET var_name offset=arithmetics length=arithmetics) {
511 + |(^(OFFSET var_name ^(OFFSET arithmetics) ^(OFFSET arithmetics))) =>
512 + ^(OFFSET var_name ^(OFFSET offset=arithmetics) ^(OFFSET length=arithmetics)) {
513 libbash_value = walker->do_substring_expansion($var_name.libbash_value, offset, length, $var_name.index);
514 }
515 - |^(OFFSET var_name offset=arithmetics) {
516 + |^(OFFSET var_name ^(OFFSET offset=arithmetics)) {
517 libbash_value = walker->do_substring_expansion($var_name.libbash_value, offset, $var_name.index);
518 }
519 |^(POUND(
520 @@ -1097,7 +1100,18 @@ primary returns[std::string libbash_value, unsigned index]
521
522 // shell arithmetic
523 // http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
524 +
525 +// We need to branches here because we have to deal with the following two expressions:
526 +// (( a=123 ))
527 +// (( a=(b=123, 4) ))
528 arithmetics returns[long value]
529 + :((ARITHMETIC) => result=arithmetic_part { $value = result; })+
530 + |result=arithmetic { $value = result; };
531 +
532 +arithmetic_part returns[long value]
533 + :^(ARITHMETIC result=arithmetics { $value = result; });
534 +
535 +arithmetic returns[long value]
536 :^(LOGICOR l=arithmetics {
537 if(l)
538 {
539
540 diff --git a/scripts/arithmetic_assignment.bash b/scripts/arithmetic_assignment.bash
541 index 49f6751..d4e678e 100644
542 --- a/scripts/arithmetic_assignment.bash
543 +++ b/scripts/arithmetic_assignment.bash
544 @@ -23,4 +23,7 @@ d=2
545 e="1+2"
546 echo $(($a + $b))
547 echo $(($a + $e))
548 -
549 +(( a=1 ))
550 +echo $a
551 +(( a=(b=2,3) ))
552 +echo $a $b
553
554 diff --git a/scripts/command_execution.bash b/scripts/command_execution.bash
555 index a10d229..e400409 100644
556 --- a/scripts/command_execution.bash
557 +++ b/scripts/command_execution.bash
558 @@ -78,3 +78,4 @@ o Hello\
559 echo \`\(\)\$\>\<\`
560 export SRC_URI="${SRC_URI} http://www.oracle.com/technology/products/berkeley-db/db/update/${MY_PV}/patch.${MY_PV}.${i}"
561 > /dev/null
562 +(( i=1, j=2)) && echo $i $j
563
564 diff --git a/scripts/compound_command.bash b/scripts/compound_command.bash
565 index ece5504..0db8ff8 100644
566 --- a/scripts/compound_command.bash
567 +++ b/scripts/compound_command.bash
568 @@ -351,3 +351,8 @@ case $target in
569 ;;
570 esac
571 echo "case end"
572 +
573 +for((i=1,j=2;i!=2&&j!=4;++i))
574 +do
575 + echo $i $j
576 +done
577
578 diff --git a/scripts/var_def.bash b/scripts/var_def.bash
579 index 09c07c6..e757b16 100644
580 --- a/scripts/var_def.bash
581 +++ b/scripts/var_def.bash
582 @@ -31,6 +31,10 @@ echo ${ARRAY02[@]}
583 ARRAY02[2]=4
584 ARRAY02[3]=5
585 echo ${ARRAY02[@]}
586 +ARRAY02[3,2]=4
587 +echo ${ARRAY02[@]}
588 +echo ${ARRAY02[2]}
589 +echo ${ARRAY02[3]}
590 EMPTY=
591 echo $EMPTY
592 PARTIAL[5]=5
593
594 diff --git a/scripts/var_expansion.bash b/scripts/var_expansion.bash
595 index 9f442b1..5f0bfca 100644
596 --- a/scripts/var_expansion.bash
597 +++ b/scripts/var_expansion.bash
598 @@ -17,6 +17,8 @@ echo ${FOO009: -2}
599 echo ${FOO009:100}
600 echo ${FOO009: -100}
601 echo ${FOO009:(-5 + 5)}
602 +echo ${FOO009:(-5 + 5,0)}
603 +echo ${FOO009:(-5 + 5,1)}
604 echo ${NOT_EXIST:0}
605 echo ${FOO009:0:2}
606 echo ${FOO009:2:2}