Gentoo Archives: gentoo-commits

From: "Petteri Räty" <betelgeuse@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/libbash:master commit in: bashast/, test/
Date: Thu, 31 Mar 2011 12:32:41
Message-Id: acead44b7a8896b85478be3eb18df0655b16cf57.betelgeuse@gentoo
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 & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=")