1 |
commit: 165e60662fcc7cd2c81ad1cb39ce9a9f2005cc50 |
2 |
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org> |
3 |
AuthorDate: Thu Mar 31 03:16:21 2011 +0000 |
4 |
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Mar 31 08:35:49 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=165e6066 |
7 |
|
8 |
Implement simple variable definition |
9 |
|
10 |
Allow to define a string with a simple value. |
11 |
|
12 |
--- |
13 |
bashast/libbashWalker.g | 11 +++++++++++ |
14 |
test/walker_test.cpp | 31 +++++++++++++++++++++++++++++++ |
15 |
2 files changed, 42 insertions(+), 0 deletions(-) |
16 |
|
17 |
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g |
18 |
index 9231d63..19cb511 100644 |
19 |
--- a/bashast/libbashWalker.g |
20 |
+++ b/bashast/libbashWalker.g |
21 |
@@ -45,6 +45,17 @@ name returns[std::string libbash_value]: |
22 |
| LETTER {$libbash_value = walker->get_string($LETTER);} |
23 |
| '_' {$libbash_value="_";}; |
24 |
|
25 |
+var_def: |
26 |
+ ^(EQUALS libbash_name=name libbash_value=string_expr){ |
27 |
+ walker->define(libbash_name, libbash_value); |
28 |
+ }; |
29 |
+ |
30 |
+string_expr returns[std::string libbash_value]: |
31 |
+ ^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; } |
32 |
+ |^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) { |
33 |
+ $libbash_value = libbash_string; |
34 |
+ }; |
35 |
+ |
36 |
// shell arithmetic |
37 |
arithmetics returns[int value] |
38 |
: |
39 |
|
40 |
diff --git a/test/walker_test.cpp b/test/walker_test.cpp |
41 |
index c026605..251e0aa 100644 |
42 |
--- a/test/walker_test.cpp |
43 |
+++ b/test/walker_test.cpp |
44 |
@@ -131,6 +131,30 @@ protected: |
45 |
} |
46 |
}; |
47 |
|
48 |
+class string_assignment_walker: public walker_test |
49 |
+{ |
50 |
+ libbashParser_var_def_return langAST; |
51 |
+protected: |
52 |
+ void init_walker(const char* script) |
53 |
+ { |
54 |
+ init_parser(script); |
55 |
+ langAST = psr->var_def(psr); |
56 |
+ nodes = antlr3CommonTreeNodeStreamNewTree(langAST.tree, |
57 |
+ ANTLR3_SIZE_HINT); |
58 |
+ treePsr = libbashWalkerNew(nodes); |
59 |
+ set_interpreter(walker); |
60 |
+ } |
61 |
+ |
62 |
+ void check_string_assignment(const char* script, |
63 |
+ const string& name, |
64 |
+ const char* exp_value) |
65 |
+ { |
66 |
+ init_walker(script); |
67 |
+ treePsr->var_def(treePsr); |
68 |
+ EXPECT_STREQ(exp_value, walker->resolve<string>(name).c_str()); |
69 |
+ } |
70 |
+}; |
71 |
+ |
72 |
#define TEST_BINARY_ARITHMETIC(name, script, exp_value)\ |
73 |
TEST_F(arithmetic_walker, name)\ |
74 |
{EXPECT_EQ(exp_value, run_arithmetic(script));} |
75 |
@@ -189,3 +213,10 @@ TEST_ARITHMETIC_ASSIGNMENT(right_shift_assignment, "value>>=2", "value", |
76 |
TEST_ARITHMETIC_ASSIGNMENT(and_assignment, "value&=10", "value", 0) |
77 |
TEST_ARITHMETIC_ASSIGNMENT(xor_assignment, "value^=5", "value", 97) |
78 |
TEST_ARITHMETIC_ASSIGNMENT(or_assignment, "value|=10", "value", 110) |
79 |
+ |
80 |
+#define TEST_STRING_ASSIGNMENT(name, script, var_name, exp_value)\ |
81 |
+ TEST_F(string_assignment_walker, name) \ |
82 |
+ { check_string_assignment(script, var_name, exp_value); } |
83 |
+ |
84 |
+TEST_STRING_ASSIGNMENT(str_assignment, "str=\"abc\"", "str", "abc") |
85 |
+TEST_STRING_ASSIGNMENT(str_assignment2, "str=\"abc_def\"", "str", "abc_def") |