diff options
author | 2011-07-21 21:57:02 +0800 | |
---|---|---|
committer | 2011-08-02 15:46:29 +0800 | |
commit | 7c27bffcc90d0c6a5dccd1dbb4bf0db9c4ee6104 (patch) | |
tree | 050c72fa7e13a3b84228953d714893036fa4903d | |
parent | Parser: make the blanks before semicolon optional (diff) | |
download | libbash-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.g | 18 | ||||
-rw-r--r-- | bashast/gunit/arith_main.gunit | 4 | ||||
-rw-r--r-- | bashast/gunit/array.gunit | 4 | ||||
-rw-r--r-- | bashast/gunit/param_main.gunit | 3 |
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))) |