* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-30 12:48 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-30 12:48 UTC (permalink / raw
To: gentoo-commits
commit: 9d9afb2e878d6104f76e958958eec6168923181f
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 28 14:57:56 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Mar 29 12:19:26 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=9d9afb2e
Implement arithmetic assignment
All the arithmetic assignment operations are supported.
---
bashast/bashwalker.g | 40 ++++++++++++++++++++++++++++++++++++++++
test/walker_test.cpp | 10 ++++++++++
2 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/bashast/bashwalker.g b/bashast/bashwalker.g
index 16d1216..d2c2438 100644
--- a/bashast/bashwalker.g
+++ b/bashast/bashwalker.g
@@ -80,6 +80,46 @@ arithmetics returns[int value]
|^(POST_INCR libbash_name=name){ $value = walker->post_incr(libbash_name); }
|^(POST_DECR libbash_name=name){ $value = walker->post_decr(libbash_name); }
|^(EQUALS libbash_name=name l=arithmetics) { walker->set_value(libbash_name, l); }
+ |^(MUL_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->multiply(walker->resolve<int>(libbash_name), l));
+ }
+ |^(DIVIDE_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->divide(walker->resolve<int>(libbash_name), l));
+ }
+ |^(MOD_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->mod(walker->resolve<int>(libbash_name), l));
+ }
+ |^(PLUS_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->plus(walker->resolve<int>(libbash_name), l));
+ }
+ |^(MINUS_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->minus(walker->resolve<int>(libbash_name), l));
+ }
+ |^(LSHIFT_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->left_shift(walker->resolve<int>(libbash_name), l));
+ }
+ |^(RSHIFT_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->right_shift(walker->resolve<int>(libbash_name), l));
+ }
+ |^(AND_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->bitwiseand(walker->resolve<int>(libbash_name), l));
+ }
+ |^(XOR_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->bitwisexor(walker->resolve<int>(libbash_name), l));
+ }
+ |^(OR_ASSIGN libbash_name=name l=arithmetics) {
+ walker->set_value(libbash_name,
+ walker->bitwiseor(walker->resolve<int>(libbash_name), l));
+ }
| NUMBER { $value = walker->parse_int($NUMBER);}
| DIGIT { $value = walker->parse_int($DIGIT);}
;
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 0a74b10..98672aa 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -168,3 +168,13 @@ TEST_BINARY_ARITHMETIC(complex_cal3, "(20&5|3||1*100-20&5*10)+~(2*5)", -1
TEST_INT_VARIABLE_VALUE(assignment, "new_var=10", "new_var", 10)
TEST_INT_VARIABLE_VALUE(assignment2, "value=10+5/2", "value", 12)
+TEST_INT_VARIABLE_VALUE(mul_assignment, "value*=10", "value", 1000)
+TEST_INT_VARIABLE_VALUE(divide_assignment, "value/=10", "value", 10)
+TEST_INT_VARIABLE_VALUE(mod_assignment, "value%=9", "value", 1)
+TEST_INT_VARIABLE_VALUE(plus_assignment, "value+=10", "value", 110)
+TEST_INT_VARIABLE_VALUE(minus_assignment, "value-=10", "value", 90)
+TEST_INT_VARIABLE_VALUE(left_shift_assignment, "value<<=2", "value", 400)
+TEST_INT_VARIABLE_VALUE(right_shift_assignment, "value>>=2", "value", 25)
+TEST_INT_VARIABLE_VALUE(and_assignment, "value&=10", "value", 0)
+TEST_INT_VARIABLE_VALUE(xor_assignment, "value^=5", "value", 97)
+TEST_INT_VARIABLE_VALUE(or_assignment, "value|=10", "value", 110)
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-30 12:48 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-30 12:48 UTC (permalink / raw
To: gentoo-commits
commit: a7194ce05fd8c216847ec9a34b741eb07839c14d
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 29 09:35:10 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Mar 29 10:18:48 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=a7194ce0
Implement arithmetic assignment
---
bashast/bashwalker.g | 1 +
test/walker_test.cpp | 13 +++++++++++++
2 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/bashast/bashwalker.g b/bashast/bashwalker.g
index d91e739..16d1216 100644
--- a/bashast/bashwalker.g
+++ b/bashast/bashwalker.g
@@ -79,6 +79,7 @@ arithmetics returns[int value]
|^(PRE_DECR libbash_name=name){ $value = walker->pre_decr(libbash_name); }
|^(POST_INCR libbash_name=name){ $value = walker->post_incr(libbash_name); }
|^(POST_DECR libbash_name=name){ $value = walker->post_decr(libbash_name); }
+ |^(EQUALS libbash_name=name l=arithmetics) { walker->set_value(libbash_name, l); }
| NUMBER { $value = walker->parse_int($NUMBER);}
| DIGIT { $value = walker->parse_int($DIGIT);}
;
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c6ad4a9..0a74b10 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -65,6 +65,12 @@ public:
init_walker(script);
return treePsr->arithmetics(treePsr);
}
+
+ int get_arithmetic_variable(const char* script, const string& name)
+ {
+ run_arithmetic(script);
+ return walker->resolve<int>(name);
+ }
};
@@ -155,3 +161,10 @@ TEST_BINARY_ARITHMETIC(complex_incr_decr2, "++value+value++", 202)
TEST_BINARY_ARITHMETIC(complex_cal, "10*(2+5)<<3%2**5", 560)
TEST_BINARY_ARITHMETIC(complex_cal2, "10*${value}<<3%2**5", 8000)
TEST_BINARY_ARITHMETIC(complex_cal3, "(20&5|3||1*100-20&5*10)+~(2*5)", -10)
+
+#define TEST_INT_VARIABLE_VALUE(name, script, var_name, exp_value)\
+ TEST_F(walker_test, name) \
+ { EXPECT_EQ(exp_value, get_arithmetic_variable(script, var_name)); }
+
+TEST_INT_VARIABLE_VALUE(assignment, "new_var=10", "new_var", 10)
+TEST_INT_VARIABLE_VALUE(assignment2, "value=10+5/2", "value", 12)
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-31 12:32 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-31 12:32 UTC (permalink / raw
To: gentoo-commits
commit: acead44b7a8896b85478be3eb18df0655b16cf57
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 31 08:25:18 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Mar 31 12:14:57 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=acead44b
Implement double quoted string literal
This includes preserved words, special characters, numbers, etc.
Expansions are not implemented yet.
---
bashast/libbashWalker.g | 48 ++++++++++++++++++++++++++++++++++++++++++++++-
test/walker_test.cpp | 13 ++++++++++++
2 files changed, 60 insertions(+), 1 deletions(-)
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 19cb511..c8e690e 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -27,6 +27,7 @@ options
@includes{
#include <memory>
+#include <string>
class interpreter;
void set_interpreter(std::shared_ptr<interpreter> w);
@@ -45,6 +46,11 @@ name returns[std::string libbash_value]:
| LETTER {$libbash_value = walker->get_string($LETTER);}
| '_' {$libbash_value="_";};
+num returns[std::string libbash_value]
+options{ k=1; }:
+ DIGIT { $libbash_value = walker->get_string($DIGIT); }
+ |NUMBER { $libbash_value = walker->get_string($NUMBER); };
+
var_def:
^(EQUALS libbash_name=name libbash_value=string_expr){
walker->define(libbash_name, libbash_value);
@@ -52,10 +58,50 @@ var_def:
string_expr returns[std::string libbash_value]:
^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
- |^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) {
+ |^(DOUBLE_QUOTED_STRING (dq_str_part { libbash_string += $dq_str_part.libbash_value; })+) {
$libbash_value = libbash_string;
};
+//A rule for filenames/strings
+res_word_str returns[std::string libbash_value]
+@after {
+ $libbash_value = walker->get_string($res_word_str.start);
+}:
+ CASE|DO|DONE|ELIF|ELSE|ESAC|FI|FOR|FUNCTION|IF|IN|SELECT|THEN|UNTIL|WHILE|TIME;
+
+//Parts of strings, no slashes, no reserved words
+ns_str_part_no_res returns[std::string libbash_value]
+options{ backtrack=true; }
+@after {
+ $libbash_value = walker->get_string($ns_str_part_no_res.start);
+}:
+ 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;
+
+//Parts of strings, no slashes
+ns_str_part returns[std::string libbash_value]:
+ ns_str_part_no_res { $libbash_value = $ns_str_part_no_res.libbash_value; }
+ |res_word_str {$libbash_value = $res_word_str.libbash_value; };
+
+//Any allowable part of a string, including slashes, no pounds
+str_part returns[std::string libbash_value]:
+ libbash_string=ns_str_part { $libbash_value = libbash_string; }
+ |SLASH { $libbash_value = "/"; };
+
+//Any allowable part of a string, with pounds
+str_part_with_pound returns[std::string libbash_value]
+@after {
+ $libbash_value = walker->get_string($str_part_with_pound.start);
+}:
+ str_part|POUND|POUNDPOUND;
+
+//Allowable parts of double quoted strings
+dq_str_part returns[std::string libbash_value]
+@after {
+ $libbash_value = walker->get_string($dq_str_part.start);
+}:
+ 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;
+
+
// shell arithmetic
arithmetics returns[int value]
:
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 251e0aa..dc593d5 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -220,3 +220,16 @@ TEST_ARITHMETIC_ASSIGNMENT(or_assignment, "value|=10", "value",
TEST_STRING_ASSIGNMENT(str_assignment, "str=\"abc\"", "str", "abc")
TEST_STRING_ASSIGNMENT(str_assignment2, "str=\"abc_def\"", "str", "abc_def")
+TEST_STRING_ASSIGNMENT(str_assignment3, "str=\"abc def\"", "str", "abc def")
+TEST_STRING_ASSIGNMENT(str_assignment4,
+ "str=\"case esac do done elif else fi if for function in select then until while time\"",
+ "str",
+ "case esac do done elif else fi if for function in select then until while time")
+TEST_STRING_ASSIGNMENT(str_assignment5,
+ "str=\"123 abc = % %% - . .. : -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä\"",
+ "str",
+ "123 abc = % %% - . .. : -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä")
+TEST_STRING_ASSIGNMENT(str_assignment6,
+ "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=\"",
+ "str",
+ "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=")
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-31 12:32 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-31 12:32 UTC (permalink / raw
To: gentoo-commits
commit: 165e60662fcc7cd2c81ad1cb39ce9a9f2005cc50
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 31 03:16:21 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Mar 31 08:35:49 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=165e6066
Implement simple variable definition
Allow to define a string with a simple value.
---
bashast/libbashWalker.g | 11 +++++++++++
test/walker_test.cpp | 31 +++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 9231d63..19cb511 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -45,6 +45,17 @@ name returns[std::string libbash_value]:
| LETTER {$libbash_value = walker->get_string($LETTER);}
| '_' {$libbash_value="_";};
+var_def:
+ ^(EQUALS libbash_name=name libbash_value=string_expr){
+ walker->define(libbash_name, libbash_value);
+ };
+
+string_expr returns[std::string libbash_value]:
+ ^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
+ |^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) {
+ $libbash_value = libbash_string;
+ };
+
// shell arithmetic
arithmetics returns[int value]
:
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c026605..251e0aa 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -131,6 +131,30 @@ protected:
}
};
+class string_assignment_walker: public walker_test
+{
+ libbashParser_var_def_return langAST;
+protected:
+ void init_walker(const char* script)
+ {
+ init_parser(script);
+ langAST = psr->var_def(psr);
+ nodes = antlr3CommonTreeNodeStreamNewTree(langAST.tree,
+ ANTLR3_SIZE_HINT);
+ treePsr = libbashWalkerNew(nodes);
+ set_interpreter(walker);
+ }
+
+ void check_string_assignment(const char* script,
+ const string& name,
+ const char* exp_value)
+ {
+ init_walker(script);
+ treePsr->var_def(treePsr);
+ EXPECT_STREQ(exp_value, walker->resolve<string>(name).c_str());
+ }
+};
+
#define TEST_BINARY_ARITHMETIC(name, script, exp_value)\
TEST_F(arithmetic_walker, name)\
{EXPECT_EQ(exp_value, run_arithmetic(script));}
@@ -189,3 +213,10 @@ TEST_ARITHMETIC_ASSIGNMENT(right_shift_assignment, "value>>=2", "value",
TEST_ARITHMETIC_ASSIGNMENT(and_assignment, "value&=10", "value", 0)
TEST_ARITHMETIC_ASSIGNMENT(xor_assignment, "value^=5", "value", 97)
TEST_ARITHMETIC_ASSIGNMENT(or_assignment, "value|=10", "value", 110)
+
+#define TEST_STRING_ASSIGNMENT(name, script, var_name, exp_value)\
+ TEST_F(string_assignment_walker, name) \
+ { check_string_assignment(script, var_name, exp_value); }
+
+TEST_STRING_ASSIGNMENT(str_assignment, "str=\"abc\"", "str", "abc")
+TEST_STRING_ASSIGNMENT(str_assignment2, "str=\"abc_def\"", "str", "abc_def")
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-04-07 16:44 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-04-07 16:44 UTC (permalink / raw
To: gentoo-commits
commit: 57038643622fa72931d2a5e9f0d0696f4cbbd6cd
Author: Petteri Räty <petsku <AT> petteriraty <DOT> eu>
AuthorDate: Thu Apr 7 11:22:59 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Apr 7 16:39:28 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=57038643
Simplify double quoted string with negation
Using the same trick with negation as previously for single quotes make
the double quote rules simpler. The test str_assignment6 was faulty as
it was starting a command expansion that was never completed.
---
bashast/bashast.g | 16 ++++------------
test/walker_test.cpp | 4 ++--
2 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/bashast/bashast.g b/bashast/bashast.g
index 3d52c27..2c72c44 100644
--- a/bashast/bashast.g
+++ b/bashast/bashast.g
@@ -368,10 +368,6 @@ ns_str_part_no_res
| name|OTHER|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;
//strings with no slashes, used in certain variable expansions
ns_str : ns_str_part* -> ^(STRING ns_str_part*);
-//Allowable parts of double quoted strings
-dq_str_part
- : 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;
//Generic strings/filenames.
fname : nqstr -> ^(STRING nqstr);
//A string that is NOT a bash reserved word
@@ -398,14 +394,10 @@ nqstr : (bracket_pattern_match|extended_pattern_match|var_ref|command_sub|arithm
//double quoted string rule, allows expansions
dqstr : QUOTE dqstr_part* QUOTE -> ^(DOUBLE_QUOTED_STRING dqstr_part*);
dqstr_part
- : bracket_pattern_match
- | extended_pattern_match
- | var_ref
- | command_sub
- | arithmetic_expansion
- | dq_str_part
- | pattern_match_trigger
- | BANG;
+ : var_ref
+ | command_sub
+ | arithmetic_expansion
+ | ~(DOLLAR|TICK|QUOTE);
//single quoted string rule, no expansions
sqstr_part
: ~SQUOTE*;
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 6081254..8185710 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -56,6 +56,6 @@ TEST_STRING_ASSIGNMENT(str_assignment5,
"str",
"123 abc = % %% - . .. : -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä")
TEST_STRING_ASSIGNMENT(str_assignment6,
- "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=\"",
+ "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=\"",
"str",
- "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } ` >= <=")
+ "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=")
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-04-14 4:50 Petteri Räty
0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-04-14 4:50 UTC (permalink / raw
To: gentoo-commits
commit: 5be695e3dd1739ff776e57a6ccb425777979d3c0
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Apr 14 01:09:28 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Apr 14 01:09:28 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=5be695e3
Raise exception if array index is less than 0
An interpreter_exception will be thrown if index is less than 0.
---
bashast/libbashWalker.g | 20 +++++++++++++++++---
test/walker_test.cpp | 13 +++++++++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 43304f1..b5e9974 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -34,6 +34,7 @@ void set_interpreter(std::shared_ptr<interpreter> w);
}
@postinclude{
#include "core/interpreter.h"
+#include <boost/format.hpp>
static std::shared_ptr<interpreter> walker;
void set_interpreter(std::shared_ptr<interpreter> w)
{
@@ -41,6 +42,17 @@ void set_interpreter(std::shared_ptr<interpreter> w)
}
}
+@members{
+
+inline void set_index(const std::string& name, unsigned& index, int value)
+{
+ if(value < 0)
+ throw interpreter_exception((boost::format("Array index is less than 0: \%s[\%d]") \% name \% value).str());
+ index = value;
+}
+
+}
+
start: list|EOF;
list: ^(LIST var_def+);
@@ -55,7 +67,7 @@ name returns[std::string libbash_value, unsigned index]
$index = 0;
}:
^(libbash_name=name_base value=arithmetics){
- $index = value;
+ set_index(libbash_name, $index, value);
$libbash_value = libbash_name;
}
|libbash_name=name_base{
@@ -70,7 +82,7 @@ options{ k=1; }:
var_def
@declarations {
std::map<int, std::string> values;
- int index = 0;
+ unsigned index = 0;
bool is_null = true;
}:
^(EQUALS name (libbash_string=string_expr { is_null = false; })?){
@@ -78,7 +90,9 @@ var_def
}
|^(EQUALS libbash_name=name_base ^(ARRAY (
(libbash_string=string_expr
- |^(EQUALS value=arithmetics { index = value; } libbash_string=string_expr))
+ |^(EQUALS value=arithmetics {
+ set_index(libbash_name, index, value);
+ } libbash_string=string_expr))
{ values[index++] = libbash_string; })*
)){
walker->define(libbash_name, values);
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 8185710..6f13176 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -59,3 +59,16 @@ TEST_STRING_ASSIGNMENT(str_assignment6,
"str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=\"",
"str",
"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=")
+
+TEST(array_index, out_of_bound)
+{
+ std::string script = "a[-1]=\"1\"";
+ std::istringstream input(script);
+ parser_builder pbuilder(input);
+ EXPECT_THROW(pbuilder.create_walker_builder(), interpreter_exception);
+
+ std::string script2 = "a=(1 2 [-5]=1)";
+ std::istringstream input2(script2);
+ parser_builder pbuilder2(input2);
+ EXPECT_THROW(pbuilder2.create_walker_builder(), interpreter_exception);
+}
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-04-14 4:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-30 12:48 [gentoo-commits] proj/libbash:master commit in: bashast/, test/ Petteri Räty
-- strict thread matches above, loose matches on Subject: below --
2011-04-14 4:50 Petteri Räty
2011-04-07 16:44 Petteri Räty
2011-03-31 12:32 Petteri Räty
2011-03-31 12:32 Petteri Räty
2011-03-30 12:48 Petteri Räty
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox