* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-05-25 19:42 Petteri Räty
0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-05-25 19:42 UTC (permalink / raw
To: gentoo-commits
commit: 4c2a0e76310000777d9da7feb4309a2b0565e0fe
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed May 25 08:46:10 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Wed May 25 13:41:12 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=4c2a0e76
Walker: throw exception if extglob used when disabled
---
bashast/libbashWalker.g | 9 +++++++++
scripts/var_expansion.bash | 1 +
test/walker_test.cpp | 17 +++++++++++++++++
3 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index cd25da3..378d5e5 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -210,21 +210,28 @@ bash_pattern[boost::xpressive::sregex& pattern, bool greedy]
using namespace boost::xpressive;
bool do_append = false;
sregex pattern_list;
+ auto check_extglob = [&]() {
+ if(!walker->get_option("extglob"))
+ throw interpreter_exception("Entered extended pattern matching with extglob disabled");
+ };
}
:^(STRING (
(EXTENDED_MATCH_AT_MOST_ONE) => ^(EXTENDED_MATCH_AT_MOST_ONE composite_pattern[pattern_list, $greedy]) {
+ check_extglob();
if($greedy)
append($pattern, !sregex(pattern_list), do_append);
else
append($pattern, -!sregex(pattern_list), do_append);
}
|(EXTENDED_MATCH_ANY) => ^(EXTENDED_MATCH_ANY composite_pattern[pattern_list, $greedy]) {
+ check_extglob();
if($greedy)
append($pattern, *sregex(pattern_list), do_append);
else
append($pattern, -*sregex(pattern_list), do_append);
}
|(EXTENDED_MATCH_AT_LEAST_ONE) => ^(EXTENDED_MATCH_AT_LEAST_ONE composite_pattern[pattern_list, $greedy]) {
+ check_extglob();
if($greedy)
append($pattern, +sregex(pattern_list), do_append);
else
@@ -232,9 +239,11 @@ bash_pattern[boost::xpressive::sregex& pattern, bool greedy]
}
// We don't have to do anything for the following rule
|(EXTENDED_MATCH_EXACTLY_ONE) => ^(EXTENDED_MATCH_EXACTLY_ONE composite_pattern[pattern_list, $greedy]) {
+ check_extglob();
append($pattern, pattern_list, do_append);
}
|(EXTENDED_MATCH_NONE) => ^(EXTENDED_MATCH_NONE composite_pattern[pattern_list, $greedy]) {
+ check_extglob();
throw interpreter_exception("!(blah) is not supported for now");
}
|basic_pattern[$pattern, $greedy, do_append])+);
diff --git a/scripts/var_expansion.bash b/scripts/var_expansion.bash
index 8fcb943..0a84737 100644
--- a/scripts/var_expansion.bash
+++ b/scripts/var_expansion.bash
@@ -1,3 +1,4 @@
+shopt -s extglob
ARRAY=(hi hello 1 2 3)
EAPI="3"
EAPI4="$((EAPI+1))"
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c3aacbb..41a4fc4 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -74,3 +74,20 @@ TEST(array_index, out_of_bound)
bash_ast ast2(input2);
EXPECT_THROW(ast2.interpret_with(walker), interpreter_exception);
}
+
+TEST(extglob, used_when_disabled)
+{
+ interpreter walker;
+
+ std::string script = "echo ${abc/?([a-z])}";
+ std::istringstream input(script);
+ bash_ast ast(input);
+ try
+ {
+ ast.interpret_with(walker);
+ }
+ catch(interpreter_exception& e)
+ {
+ EXPECT_STREQ(e.what(), "Entered extended pattern matching with extglob disabled");
+ }
+}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-06-21 13:26 Petteri Räty
0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-06-21 13:26 UTC (permalink / raw
To: gentoo-commits
commit: 602e860e3ef44afbd8af4b5aafff993a1a0d8aed
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 15 07:12:14 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Jun 21 13:23:34 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=602e860e
Walker: first support for brace expansion
We only support brace expansion in raw string for now. Other cases
will cause an interpreter_exception.
---
bashast/libbashWalker.g | 38 +++++++++++++++++++++++++++++++++++-
scripts/var_expansion.bash | 3 ++
scripts/var_expansion.bash.result | 3 ++
test/walker_test.cpp | 10 +++++++++
4 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index fda4ef6..320e69a 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -45,6 +45,7 @@ options
#include <sstream>
#include <boost/format.hpp>
+ #include <boost/algorithm/string/join.hpp>
#include "builtins/builtin_exceptions.h"
#include "core/bash_condition.h"
@@ -210,17 +211,47 @@ var_def[bool local]
string_expr returns[std::string libbash_value, bool quoted]
@init {
$quoted = true;
+ bool is_raw_string = true;
+ std::vector<std::string> brace_expansion_base{""};
+ std::vector<std::string> brace_expansion_elements;
+}
+@after {
+ if(!is_raw_string && brace_expansion_base.size() > 1)
+ throw libbash::interpreter_exception("We only support brace expansion in raw string for now");
+ $libbash_value = boost::algorithm::join(brace_expansion_base, " ");
}
:^(STRING (
string_part {
- $libbash_value += $string_part.libbash_value;
+ for(auto iter = brace_expansion_base.begin(); iter != brace_expansion_base.end(); ++iter)
+ *iter += $string_part.libbash_value;
$quoted = $string_part.quoted;
+ if(is_raw_string)
+ is_raw_string = $string_part.is_raw_string;
+ }
+ |(BRACE_EXP) => ^(BRACE_EXP brace_expansion[brace_expansion_elements]) {
+ auto group_number = brace_expansion_elements.size();
+ auto group_size = brace_expansion_base.size();
+ std::vector<std::string> expanded_values;
+
+ expanded_values.reserve(group_number * group_size);
+ for(auto iter = brace_expansion_base.begin(); iter != brace_expansion_base.end(); ++iter)
+ for(std::vector<std::string>::size_type i = 0u; i != group_number; ++i)
+ expanded_values.push_back(*iter + brace_expansion_elements[i \% group_number]);
+
+ brace_expansion_base.swap(expanded_values);
+ brace_expansion_elements.clear();
}
)*);
-string_part returns[std::string libbash_value, bool quoted]
+brace_expansion[std::vector<std::string>& elements]
+ :(string_expr{
+ $elements.push_back($string_expr.libbash_value);
+ })+;
+
+string_part returns[std::string libbash_value, bool quoted, bool is_raw_string]
@init {
$quoted = false;
+ $is_raw_string = true;
}
:(DOUBLE_QUOTED_STRING) =>
^(DOUBLE_QUOTED_STRING (libbash_string=double_quoted_string {
@@ -235,12 +266,15 @@ string_part returns[std::string libbash_value, bool quoted]
|(ARITHMETIC_EXPRESSION) =>
^(ARITHMETIC_EXPRESSION value=arithmetics {
$libbash_value = boost::lexical_cast<std::string>(value);
+ $is_raw_string = false;
})
|(var_ref[false]) => libbash_string=var_ref[false] {
$libbash_value = libbash_string;
+ $is_raw_string = false;
}
|libbash_string=command_substitution {
$libbash_value = libbash_string;
+ $is_raw_string = false;
}
|(libbash_string=any_string {
$libbash_value = libbash_string;
diff --git a/scripts/var_expansion.bash b/scripts/var_expansion.bash
index 9f42f19..16573a9 100644
--- a/scripts/var_expansion.bash
+++ b/scripts/var_expansion.bash
@@ -110,3 +110,6 @@ ARRAY=(1 2 3 4 5)
echo ${ARRAY[@]:1}
echo ${ARRAY[@]:1:3}
echo $#
+echo a{b,c}d
+echo a{a,bc}d{e,}f
+echo a{ab,cd}d{ef,gh}
diff --git a/scripts/var_expansion.bash.result b/scripts/var_expansion.bash.result
index bd83c62..52c87c0 100644
--- a/scripts/var_expansion.bash.result
+++ b/scripts/var_expansion.bash.result
@@ -5,6 +5,9 @@ abcabc
2 3 4 5
2 3 4
0
+abd acd
+aadef aadf abcdef abcdf
+aabdef aabdgh acddef acddgh
ARRAY=1 2 3 4 5
ARRAY2=hello
EAPI=3
diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 5a64b04..20cb00d 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -90,3 +90,13 @@ TEST(extglob, used_when_disabled)
EXPECT_STREQ(e.what(), "Entered extended pattern matching with extglob disabled");
}
}
+
+TEST(brace_expansion, not_in_raw_string)
+{
+ interpreter walker;
+
+ std::string script = "echo $ab{c,d}e";
+ std::istringstream input(script);
+ bash_ast ast(input);
+ EXPECT_THROW(ast.interpret_with(walker), libbash::interpreter_exception);
+}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-08-04 13:53 Petteri Räty
0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-08-04 13:53 UTC (permalink / raw
To: gentoo-commits
commit: 9042ed3ac8b75202e71e5de49376e0b1c68e847f
Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 27 08:55:46 2011 +0000
Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Aug 2 07:52:18 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=9042ed3a
Parser: support empty command with redirection
Now only '>' is supported because there would be a lot of conflicts if
we want to fully support this. Also the operator other than '>' doesn't
make sense.
---
bashast/bashast.g | 34 ++++++++++++++++++++++++----------
bashast/libbashWalker.g | 6 +++++-
scripts/command_execution.bash | 1 +
test/verify_error_output_test.sh | 2 +-
4 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/bashast/bashast.g b/bashast/bashast.g
index 55a499d..dc0ff1b 100644
--- a/bashast/bashast.g
+++ b/bashast/bashast.g
@@ -226,6 +226,9 @@ tokens{
||token == LESS_THAN
||token == GREATER_THAN
||token == RSHIFT
+ ||token == AMP_LESS_THAN
+ ||token == AMP_GREATER_THAN
+ ||token == AMP_RSHIFT
// for end of command
||token == SEMIC
||token == EOL
@@ -325,7 +328,7 @@ here_document_operator
here_document_begin
: (
- token=~(EOL|BLANK|LESS_THAN|HERE_STRING_OP|AMP|GREATER_THAN|RSHIFT)
+ token=~(EOL|BLANK|LESS_THAN|HERE_STRING_OP|GREATER_THAN|RSHIFT|AMP_LESS_THAN|AMP_GREATER_THAN|AMP_RSHIFT)
{
if(LA(-1) != DQUOTE && LA(-1) != ESC)
{
@@ -347,13 +350,13 @@ redirection_operator
: BLANK! DIGIT redirection_operator
| BLANK?
(
- AMP LESS_THAN -> OP["&<"]
+ AMP_LESS_THAN -> OP["&<"]
| GREATER_THAN AMP -> OP[">&"]
| LESS_THAN AMP -> OP["<&"]
| LESS_THAN GREATER_THAN -> OP["<>"]
| RSHIFT -> OP[">>"]
- | AMP GREATER_THAN -> OP["&>"]
- | AMP RSHIFT -> OP ["&>>"]
+ | AMP_GREATER_THAN -> OP["&>"]
+ | AMP_RSHIFT -> OP ["&>>"]
| LESS_THAN -> LESS_THAN
| GREATER_THAN -> GREATER_THAN
);
@@ -376,21 +379,29 @@ command_atom
| -> ^(VARIABLE_DEFINITIONS variable_definitions)
)
| (EXPORT) => EXPORT BLANK export_item -> ^(STRING EXPORT) ^(STRING ^(DOUBLE_QUOTED_STRING export_item))
- | string_expr_no_reserved_word
+ | command_name
(
(BLANK? parens) => BLANK? parens wspace? compound_command
- -> ^(FUNCTION["function"] string_expr_no_reserved_word compound_command)
+ -> ^(FUNCTION["function"] command_name compound_command)
| (
{LA(1) == BLANK &&
(
!is_special_token(LA(2))
// redirection
- &&(LA(2) != DIGIT || (LA(3) != AMP && LA(3) != LESS_THAN
- && LA(3) != GREATER_THAN && LA(3) != RSHIFT))
+ &&(LA(2) != DIGIT || (LA(3) != AMP_LESS_THAN &&
+ LA(3) != AMP_GREATER_THAN &&
+ LA(3) != AMP_RSHIFT &&
+ LA(3) != GREATER_THAN &&
+ LA(3) != LESS_THAN &&
+ LA(3) != RSHIFT))
)}? => BLANK bash_command_arguments
- )* -> string_expr_no_reserved_word bash_command_arguments*
+ )* -> command_name bash_command_arguments*
);
+command_name
+ : string_expr_no_reserved_word
+ | {LA(1) == GREATER_THAN}? => redirection_atom -> ^(STRING NAME) redirection_atom;
+
variable_definitions
: (
variable_definition_atom ((BLANK name (LSQUARE|EQUALS|PLUS EQUALS)) => BLANK! variable_definition_atom)*
@@ -765,7 +776,7 @@ pattern_char
: LETTER|DIGIT|OTHER|QMARK|COLON|AT|SEMIC|POUND|SLASH
|BANG|TIMES|COMMA|PIPE|AMP|MINUS|PLUS|PCT|LSQUARE|RSQUARE
|RPAREN|LPAREN|RBRACE|LBRACE|DOLLAR|TICK|DOT|LESS_THAN
- |GREATER_THAN|SQUOTE|DQUOTE;
+ |GREATER_THAN|SQUOTE|DQUOTE|AMP_LESS_THAN|AMP_GREATER_THAN|AMP_RSHIFT;
variable_reference
: DOLLAR LBRACE parameter_expansion RBRACE -> ^(VAR_REF parameter_expansion)
@@ -1041,6 +1052,9 @@ LESS_THAN : '<';
GREATER_THAN : '>';
LSHIFT : '<<';
RSHIFT : '>>';
+AMP_LESS_THAN : '&<';
+AMP_GREATER_THAN : '&>';
+AMP_RSHIFT : '&>>';
SEMIC : ';';
DOUBLE_SEMIC : ';;';
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index d1bbe93..7deb461 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -579,7 +579,7 @@ simple_command
}
:string_expr (argument[libbash_args])* execute_command[$string_expr.libbash_value, libbash_args];
-execute_command[const std::string& name, std::vector<std::string>& libbash_args]
+execute_command[std::string& name, std::vector<std::string>& libbash_args]
@declarations {
interpreter::local_scope current_scope(*walker);
std::unique_ptr<std::ostream> out;
@@ -588,6 +588,10 @@ execute_command[const std::string& name, std::vector<std::string>& libbash_args]
bool redirection = false;
}
:var_def[true]* (redirect[out, err, in]{ redirection = true; })* {
+ // Empty command, still need to run bash redirection
+ if(name.empty())
+ name = ":";
+
if(walker->has_function(name))
{
if(redirection)
diff --git a/scripts/command_execution.bash b/scripts/command_execution.bash
index 05e2177..132d72d 100644
--- a/scripts/command_execution.bash
+++ b/scripts/command_execution.bash
@@ -74,3 +74,4 @@ o Hello\
world
echo \`\(\)\$\>\<\`
export SRC_URI="${SRC_URI} http://www.oracle.com/technology/products/berkeley-db/db/update/${MY_PV}/patch.${MY_PV}.${i}"
+> /dev/null
diff --git a/test/verify_error_output_test.sh b/test/verify_error_output_test.sh
index 48e972b..cbf6cf2 100755
--- a/test/verify_error_output_test.sh
+++ b/test/verify_error_output_test.sh
@@ -2,4 +2,4 @@
illegal="${srcdir}/scripts/illegal_script.sh"
output=$(./variable_printer "$illegal" 2>&1)
-[[ $output == "${illegal}(1) : error 10 : Missing token, at offset 3"* ]]
+[[ $output == "${illegal}(1) : error 1 : Unexpected token, at offset 3"* ]]
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-08-04 13:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-21 13:26 [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/ Petteri Räty
-- strict thread matches above, loose matches on Subject: below --
2011-08-04 13:53 Petteri Räty
2011-05-25 19:42 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