1 |
commit: acead44b7a8896b85478be3eb18df0655b16cf57 |
2 |
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org> |
3 |
AuthorDate: Thu Mar 31 08:25:18 2011 +0000 |
4 |
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Mar 31 12:14:57 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=acead44b |
7 |
|
8 |
Implement double quoted string literal |
9 |
|
10 |
This includes preserved words, special characters, numbers, etc. |
11 |
Expansions are not implemented yet. |
12 |
|
13 |
--- |
14 |
bashast/libbashWalker.g | 48 ++++++++++++++++++++++++++++++++++++++++++++++- |
15 |
test/walker_test.cpp | 13 ++++++++++++ |
16 |
2 files changed, 60 insertions(+), 1 deletions(-) |
17 |
|
18 |
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g |
19 |
index 19cb511..c8e690e 100644 |
20 |
--- a/bashast/libbashWalker.g |
21 |
+++ b/bashast/libbashWalker.g |
22 |
@@ -27,6 +27,7 @@ options |
23 |
|
24 |
@includes{ |
25 |
#include <memory> |
26 |
+#include <string> |
27 |
|
28 |
class interpreter; |
29 |
void set_interpreter(std::shared_ptr<interpreter> w); |
30 |
@@ -45,6 +46,11 @@ name returns[std::string libbash_value]: |
31 |
| LETTER {$libbash_value = walker->get_string($LETTER);} |
32 |
| '_' {$libbash_value="_";}; |
33 |
|
34 |
+num returns[std::string libbash_value] |
35 |
+options{ k=1; }: |
36 |
+ DIGIT { $libbash_value = walker->get_string($DIGIT); } |
37 |
+ |NUMBER { $libbash_value = walker->get_string($NUMBER); }; |
38 |
+ |
39 |
var_def: |
40 |
^(EQUALS libbash_name=name libbash_value=string_expr){ |
41 |
walker->define(libbash_name, libbash_value); |
42 |
@@ -52,10 +58,50 @@ var_def: |
43 |
|
44 |
string_expr returns[std::string libbash_value]: |
45 |
^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; } |
46 |
- |^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) { |
47 |
+ |^(DOUBLE_QUOTED_STRING (dq_str_part { libbash_string += $dq_str_part.libbash_value; })+) { |
48 |
$libbash_value = libbash_string; |
49 |
}; |
50 |
|
51 |
+//A rule for filenames/strings |
52 |
+res_word_str returns[std::string libbash_value] |
53 |
+@after { |
54 |
+ $libbash_value = walker->get_string($res_word_str.start); |
55 |
+}: |
56 |
+ CASE|DO|DONE|ELIF|ELSE|ESAC|FI|FOR|FUNCTION|IF|IN|SELECT|THEN|UNTIL|WHILE|TIME; |
57 |
+ |
58 |
+//Parts of strings, no slashes, no reserved words |
59 |
+ns_str_part_no_res returns[std::string libbash_value] |
60 |
+options{ backtrack=true; } |
61 |
+@after { |
62 |
+ $libbash_value = walker->get_string($ns_str_part_no_res.start); |
63 |
+}: |
64 |
+ num|name|EQUALS|PCT|PCTPCT|MINUS|DOT|DOTDOT|COLON|BOP|UOP|TEST_EXPR|'_'|TILDE|INC|DEC|MUL_ASSIGN|DIVIDE_ASSIGN|MOD_ASSIGN|PLUS_ASSIGN|MINUS_ASSIGN|LSHIFT_ASSIGN|RSHIFT_ASSIGN|AND_ASSIGN|XOR_ASSIGN|OR_ASSIGN|ESC_CHAR|CARET|OTHER; |
65 |
+ |
66 |
+//Parts of strings, no slashes |
67 |
+ns_str_part returns[std::string libbash_value]: |
68 |
+ ns_str_part_no_res { $libbash_value = $ns_str_part_no_res.libbash_value; } |
69 |
+ |res_word_str {$libbash_value = $res_word_str.libbash_value; }; |
70 |
+ |
71 |
+//Any allowable part of a string, including slashes, no pounds |
72 |
+str_part returns[std::string libbash_value]: |
73 |
+ libbash_string=ns_str_part { $libbash_value = libbash_string; } |
74 |
+ |SLASH { $libbash_value = "/"; }; |
75 |
+ |
76 |
+//Any allowable part of a string, with pounds |
77 |
+str_part_with_pound returns[std::string libbash_value] |
78 |
+@after { |
79 |
+ $libbash_value = walker->get_string($str_part_with_pound.start); |
80 |
+}: |
81 |
+ str_part|POUND|POUNDPOUND; |
82 |
+ |
83 |
+//Allowable parts of double quoted strings |
84 |
+dq_str_part returns[std::string libbash_value] |
85 |
+@after { |
86 |
+ $libbash_value = walker->get_string($dq_str_part.start); |
87 |
+}: |
88 |
+ BLANK|EOL|AMP|LOGICAND|LOGICOR|LESS_THAN|GREATER_THAN|PIPE|SQUOTE|SEMIC|COMMA|LPAREN|RPAREN|LLPAREN|RRPAREN|DOUBLE_SEMIC|LBRACE|RBRACE|TICK|LEQ|GEQ|str_part_with_pound; |
89 |
+ |
90 |
+ |
91 |
// shell arithmetic |
92 |
arithmetics returns[int value] |
93 |
: |
94 |
|
95 |
diff --git a/test/walker_test.cpp b/test/walker_test.cpp |
96 |
index 251e0aa..dc593d5 100644 |
97 |
--- a/test/walker_test.cpp |
98 |
+++ b/test/walker_test.cpp |
99 |
@@ -220,3 +220,16 @@ TEST_ARITHMETIC_ASSIGNMENT(or_assignment, "value|=10", "value", |
100 |
|
101 |
TEST_STRING_ASSIGNMENT(str_assignment, "str=\"abc\"", "str", "abc") |
102 |
TEST_STRING_ASSIGNMENT(str_assignment2, "str=\"abc_def\"", "str", "abc_def") |
103 |
+TEST_STRING_ASSIGNMENT(str_assignment3, "str=\"abc def\"", "str", "abc def") |
104 |
+TEST_STRING_ASSIGNMENT(str_assignment4, |
105 |
+ "str=\"case esac do done elif else fi if for function in select then until while time\"", |
106 |
+ "str", |
107 |
+ "case esac do done elif else fi if for function in select then until while time") |
108 |
+TEST_STRING_ASSIGNMENT(str_assignment5, |
109 |
+ "str=\"123 abc = % %% - . .. : -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä\"", |
110 |
+ "str", |
111 |
+ "123 abc = % %% - . .. : -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä") |
112 |
+TEST_STRING_ASSIGNMENT(str_assignment6, |
113 |
+ "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=\"", |
114 |
+ "str", |
115 |
+ "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=") |