1 |
commit: e399dff749def2cd11ab44cf53896c849f1429a8 |
2 |
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Apr 4 08:57:46 2011 +0000 |
4 |
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Apr 4 15:57:05 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=e399dff7 |
7 |
|
8 |
Implement parameter expansion: ${parameter:-word} |
9 |
|
10 |
--- |
11 |
bashast/libbashWalker.g | 26 ++++++++++++++++++++++++-- |
12 |
scripts/var_expansion.ebuild | 2 ++ |
13 |
scripts/var_expansion.ebuild.result | 2 ++ |
14 |
src/core/interpreter.h | 6 ++++++ |
15 |
4 files changed, 34 insertions(+), 2 deletions(-) |
16 |
|
17 |
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g |
18 |
index ddfef7a..d0f89bf 100644 |
19 |
--- a/bashast/libbashWalker.g |
20 |
+++ b/bashast/libbashWalker.g |
21 |
@@ -62,7 +62,8 @@ var_def: |
22 |
|
23 |
string_expr returns[std::string libbash_value]: |
24 |
^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; } |
25 |
- |^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*); |
26 |
+ |^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*) |
27 |
+ |^(STRING libbash_string=dqstr) { $libbash_value = libbash_string; }; |
28 |
|
29 |
//A rule for filenames/strings |
30 |
res_word_str returns[std::string libbash_value] |
31 |
@@ -109,9 +110,30 @@ dqstr returns[std::string libbash_value]: |
32 |
| libbash_string=var_ref { $libbash_value = libbash_string; } |
33 |
| ^(ARITHMETIC_EXPRESSION value=arithmetics) { $libbash_value = boost::lexical_cast<std::string>(value); }; |
34 |
|
35 |
+//Allowable variable names in the variable expansion |
36 |
+var_name returns[std::string libbash_value] |
37 |
+@after { |
38 |
+ $libbash_value = walker->get_string($var_name.start); |
39 |
+}: |
40 |
+ num|name|TIMES|AT; |
41 |
+ |
42 |
+var_exp returns[std::string libbash_value]: |
43 |
+ ^(USE_DEFAULT var_name libbash_word=word) { |
44 |
+ libbash_value = walker->do_default_expansion($var_name.libbash_value, libbash_word); |
45 |
+ }; |
46 |
+ |
47 |
+word returns[std::string libbash_value]: |
48 |
+ // Avoid conflict with arithmetics (both have VAR_DEF) |
49 |
+ (var_ref) => libbash_string=var_ref { $libbash_value = libbash_string; } |
50 |
+ // Avoid conflict with arithmetics (both have num) |
51 |
+ |(num) => libbash_string=num { $libbash_value = libbash_string; } |
52 |
+ |libbash_string=string_expr { $libbash_value = libbash_string; } |
53 |
+ |value=arithmetics { $libbash_value = boost::lexical_cast<std::string>(value); }; |
54 |
+ |
55 |
//variable reference |
56 |
var_ref returns[std::string libbash_value]: |
57 |
- ^(VAR_REF libbash_name=name) { $libbash_value=walker->resolve<std::string>(libbash_name); }; |
58 |
+ ^(VAR_REF libbash_name=name) { $libbash_value = walker->resolve<std::string>(libbash_name); } |
59 |
+ |^(VAR_REF libbash_string=var_exp) { $libbash_value = libbash_string; }; |
60 |
|
61 |
// shell arithmetic |
62 |
arithmetics returns[int value] |
63 |
|
64 |
diff --git a/scripts/var_expansion.ebuild b/scripts/var_expansion.ebuild |
65 |
index a5cadb6..62e95c3 100644 |
66 |
--- a/scripts/var_expansion.ebuild |
67 |
+++ b/scripts/var_expansion.ebuild |
68 |
@@ -1,2 +1,4 @@ |
69 |
EAPI="3" |
70 |
EAPI4="$(($EAPI+1))" |
71 |
+FOO="${EAPI:-hello}" |
72 |
+FOO2="${EAPI3:-hello}" |
73 |
|
74 |
diff --git a/scripts/var_expansion.ebuild.result b/scripts/var_expansion.ebuild.result |
75 |
index cec88e4..f92abe4 100644 |
76 |
--- a/scripts/var_expansion.ebuild.result |
77 |
+++ b/scripts/var_expansion.ebuild.result |
78 |
@@ -1,2 +1,4 @@ |
79 |
EAPI=3 |
80 |
EAPI4=4 |
81 |
+FOO=3 |
82 |
+FOO2=hello |
83 |
|
84 |
diff --git a/src/core/interpreter.h b/src/core/interpreter.h |
85 |
index 1ce1076..2fc8703 100644 |
86 |
--- a/src/core/interpreter.h |
87 |
+++ b/src/core/interpreter.h |
88 |
@@ -410,5 +410,11 @@ public: |
89 |
new variable(name, value, readonly, is_null)); |
90 |
members.define(target); |
91 |
} |
92 |
+ |
93 |
+ const std::string do_default_expansion(const std::string& name, |
94 |
+ const std::string& value) |
95 |
+ { |
96 |
+ return (is_null(name)? value : resolve<std::string>(name)); |
97 |
+ } |
98 |
}; |
99 |
#endif |