aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMu Qiao <qiaomuf@gentoo.org>2012-03-26 17:34:49 +0800
committerMu Qiao <qiaomuf@gentoo.org>2012-03-26 20:04:42 +0800
commit6d95304b292a398ddfd42a2ef1115cf8e94928b5 (patch)
treedae4147092375003401630951845efa6b2e3f313 /bashast
parentParser: allow ';' after local and export (diff)
downloadlibbash-6d95304b292a398ddfd42a2ef1115cf8e94928b5.tar.gz
libbash-6d95304b292a398ddfd42a2ef1115cf8e94928b5.tar.bz2
libbash-6d95304b292a398ddfd42a2ef1115cf8e94928b5.zip
Walker: support appending array to array
Diffstat (limited to 'bashast')
-rw-r--r--bashast/libbashWalker.g29
1 files changed, 22 insertions, 7 deletions
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 5e3fd6e..5d5b557 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -217,19 +217,34 @@ var_def[bool local]
else
walker->set_value($name.libbash_value, $string_expr.libbash_value, $name.index);
}
- |^(EQUALS libbash_name=name_base ^(ARRAY (
- (expr=string_expr
- |^(EQUALS value=arithmetics {
- set_index(libbash_name, index, value);
- } expr=string_expr))
- { values[index++] = expr.libbash_value; })*
- )){
+ |^(EQUALS libbash_name=name_base array_def_helper[libbash_name, values, index]){
if(local)
walker->define_local(libbash_name, values);
else
walker->define(libbash_name, values);
+ }
+ |^(PLUS_ASSIGN libbash_name=name_base {
+ index = walker->get_max_index(libbash_name) + 1;
+ if(index == 1) // The variable is not defined
+ index = 0;
+ } array_def_helper[libbash_name, values, index]){
+ if(local)
+ throw libbash::unsupported_exception("Appending array to local variable is not supported");
+ for(auto iter = values.begin(); iter != values.end(); ++iter)
+ walker->set_value(libbash_name, iter->second, iter->first);
};
+array_def_helper[const std::string& libbash_name, std::map<unsigned, std::string>& values, unsigned index]
+ :^(ARRAY (
+ (
+ expr=string_expr
+ |^(EQUALS value=arithmetics {
+ set_index(libbash_name, index, value);
+ } expr=string_expr)
+ )
+ { values[index++] = expr.libbash_value; }
+ )*);
+
string_expr returns[std::string libbash_value, bool quoted]
@init {
$quoted = true;