aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMu Qiao <qiaomuf@gentoo.org>2011-07-21 21:57:02 +0800
committerMu Qiao <qiaomuf@gentoo.org>2011-08-02 15:46:29 +0800
commit7c27bffcc90d0c6a5dccd1dbb4bf0db9c4ee6104 (patch)
tree050c72fa7e13a3b84228953d714893036fa4903d
parentParser: make the blanks before semicolon optional (diff)
downloadlibbash-7c27bffcc90d0c6a5dccd1dbb4bf0db9c4ee6104.tar.gz
libbash-7c27bffcc90d0c6a5dccd1dbb4bf0db9c4ee6104.tar.bz2
libbash-7c27bffcc90d0c6a5dccd1dbb4bf0db9c4ee6104.zip
Parser: remove tokens for += and -=
This makes ${a:-=} and ${a:+=} work properly.
-rw-r--r--bashast/bashast.g18
-rw-r--r--bashast/gunit/arith_main.gunit4
-rw-r--r--bashast/gunit/array.gunit4
-rw-r--r--bashast/gunit/param_main.gunit3
4 files changed, 16 insertions, 13 deletions
diff --git a/bashast/bashast.g b/bashast/bashast.g
index b4804fa..0a9557e 100644
--- a/bashast/bashast.g
+++ b/bashast/bashast.g
@@ -111,6 +111,8 @@ tokens{
PLUS_SIGN;
MINUS_SIGN;
+ PLUS_ASSIGN;
+ MINUS_ASSIGN;
NOT_EQUALS;
EQUALS_TO;
@@ -311,7 +313,7 @@ command_atom
: (FOR|SELECT|IF|WHILE|UNTIL|CASE|LPAREN|LBRACE|LLPAREN|LSQUARE|TEST_EXPR) => compound_command
| FUNCTION BLANK string_expr_no_reserved_word ((BLANK? parens wspace?)|wspace) compound_command
-> ^(FUNCTION string_expr_no_reserved_word compound_command)
- | (name (LSQUARE|EQUALS|PLUS_ASSIGN)|LOCAL|EXPORT) => variable_definitions
+ | (name (LSQUARE|EQUALS|PLUS EQUALS)|LOCAL|EXPORT) => variable_definitions
(
(BLANK bash_command) => BLANK bash_command -> bash_command variable_definitions
| -> ^(VARIABLE_DEFINITIONS variable_definitions)
@@ -351,7 +353,7 @@ command_atom
variable_definitions
: (
- variable_definition_atom ((BLANK name (LSQUARE|EQUALS|PLUS_ASSIGN)) => BLANK! variable_definition_atom)*
+ variable_definition_atom ((BLANK name (LSQUARE|EQUALS|PLUS EQUALS)) => BLANK! variable_definition_atom)*
| (LOCAL) => LOCAL BLANK! local_item ((BLANK name) => BLANK! local_item)*
| (EXPORT) => EXPORT! ((BLANK name) => BLANK! export_item)+
);
@@ -360,8 +362,8 @@ variable_definition_atom
: name LSQUARE BLANK? explicit_arithmetic BLANK? RSQUARE EQUALS string_expr?
-> ^(EQUALS ^(name explicit_arithmetic) string_expr?)
| name EQUALS value? -> ^(EQUALS name value?)
- | name PLUS_ASSIGN array_value -> ^(PLUS_ASSIGN name array_value)
- | name PLUS_ASSIGN string_expr_part?
+ | name PLUS EQUALS array_value -> ^(PLUS_ASSIGN name array_value)
+ | name PLUS EQUALS string_expr_part?
-> ^(EQUALS name ^(STRING ^(VAR_REF name) string_expr_part?));
value
: string_expr
@@ -658,7 +660,7 @@ string_part
ns_string_part
: num|name|escaped_character
|OTHER|EQUALS|PCT|PCTPCT|PLUS|MINUS|DOT|DOTDOT|COLON|TEST_EXPR
- |TILDE|MUL_ASSIGN|DIVIDE_ASSIGN|MOD_ASSIGN|PLUS_ASSIGN|MINUS_ASSIGN
+ |TILDE|MUL_ASSIGN|DIVIDE_ASSIGN|MOD_ASSIGN
|LSHIFT_ASSIGN|RSHIFT_ASSIGN|AND_ASSIGN|XOR_ASSIGN|LSQUARE|RSQUARE
|OR_ASSIGN|CARET|POUND|POUNDPOUND|COMMA|EXPORT|LOCAL|AT;
@@ -878,8 +880,8 @@ arithmetic_assignment_operator
| MUL_ASSIGN
| DIVIDE_ASSIGN
| MOD_ASSIGN
- | PLUS_ASSIGN
- | MINUS_ASSIGN
+ | PLUS EQUALS -> PLUS_ASSIGN
+ | MINUS EQUALS -> MINUS_ASSIGN
| LSHIFT_ASSIGN
| RSHIFT_ASSIGN
| AND_ASSIGN
@@ -993,8 +995,6 @@ RSHIFT : '>>';
MUL_ASSIGN : '*=';
DIVIDE_ASSIGN : '/=';
MOD_ASSIGN : '%=';
-PLUS_ASSIGN : '+=';
-MINUS_ASSIGN : '-=';
LSHIFT_ASSIGN : '<<=';
RSHIFT_ASSIGN : '>>=';
AND_ASSIGN : '&=';
diff --git a/bashast/gunit/arith_main.gunit b/bashast/gunit/arith_main.gunit
index 5249b5a..c32ff21 100644
--- a/bashast/gunit/arith_main.gunit
+++ b/bashast/gunit/arith_main.gunit
@@ -111,8 +111,8 @@ arithmetics_test:
"var *= 5" -> (*= var 5)
"var /= 5" -> (/= var 5)
"var %= 5" -> (%= var 5)
-"asdf += 5" -> (+= asdf 5)
-"var -= 5" -> (-= var 5)
+"asdf += 5" -> (PLUS_ASSIGN asdf 5)
+"var -= 5" -> (MINUS_ASSIGN var 5)
"var <<= 5" -> (<<= var 5)
"var >>= 5" -> (>>= var 5)
"var &= 5" -> (&= var 5)
diff --git a/bashast/gunit/array.gunit b/bashast/gunit/array.gunit
index b3bdf3b..c304e7c 100644
--- a/bashast/gunit/array.gunit
+++ b/bashast/gunit/array.gunit
@@ -28,8 +28,8 @@ variable_definition_atom:
${VAR}
)" -> (= asdf (ARRAY (STRING - - disable - dependency - tracking) (STRING (VAR_REF VAR))))
"asdf=()" -> (= asdf ARRAY)
-"asdf+=()" -> (+= asdf ARRAY)
-"asdf+=(a)" -> (+= asdf (ARRAY (STRING a)))
+"asdf+=()" -> (PLUS_ASSIGN asdf ARRAY)
+"asdf+=(a)" -> (PLUS_ASSIGN asdf (ARRAY (STRING a)))
variable_reference:
"$asdf" -> (VAR_REF asdf)
diff --git a/bashast/gunit/param_main.gunit b/bashast/gunit/param_main.gunit
index 306d3c6..0a56a57 100644
--- a/bashast/gunit/param_main.gunit
+++ b/bashast/gunit/param_main.gunit
@@ -22,6 +22,9 @@ variable_reference:
"$asdf" -> (VAR_REF asdf)
"${asdf}" -> (VAR_REF asdf)
"${asdf:-foo}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING foo)))
+"${asdf:-=}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING =)))
+"${asdf:+=}" -> (VAR_REF (USE_ALTERNATE_WHEN_UNSET_OR_NULL asdf (STRING =)))
+"${asdf:==}" -> (VAR_REF (ASSIGN_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING =)))
"${asdf:-public_html}" -> (VAR_REF (USE_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING public_html)))
"${asdf='foo'}" -> (VAR_REF (ASSIGN_DEFAULT_WHEN_UNSET asdf (STRING 'foo')))
"${asdf:=}" -> (VAR_REF (ASSIGN_DEFAULT_WHEN_UNSET_OR_NULL asdf (STRING EMPTY_EXPANSION_VALUE)))