From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1Q8ReU-0004qy-6z for garchives@archives.gentoo.org; Sat, 09 Apr 2011 06:28:10 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 13D561C019; Sat, 9 Apr 2011 06:27:38 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id C09111C019 for ; Sat, 9 Apr 2011 06:27:37 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 392901B405B for ; Sat, 9 Apr 2011 06:27:37 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 8E9D480019 for ; Sat, 9 Apr 2011 06:27:36 +0000 (UTC) From: "Petteri Räty" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Petteri Räty" Message-ID: <95c2c86fdd4a52250393e05bbe5648367d5759ee.betelgeuse@gentoo> Subject: [gentoo-commits] proj/libbash:master commit in: bashast/, bashast/gunit/ X-VCS-Repository: proj/libbash X-VCS-Files: bashast/bashast.g bashast/gunit/brace.gunit bashast/gunit/expansions.gunit X-VCS-Directories: bashast/ bashast/gunit/ X-VCS-Committer: betelgeuse X-VCS-Committer-Name: Petteri Räty X-VCS-Revision: 95c2c86fdd4a52250393e05bbe5648367d5759ee Date: Sat, 9 Apr 2011 06:27:36 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 865485300081f9216095c5fb1bf818ca commit: 95c2c86fdd4a52250393e05bbe5648367d5759ee Author: Petteri R=C3=A4ty petteriraty eu> AuthorDate: Fri Apr 8 18:57:03 2011 +0000 Commit: Petteri R=C3=A4ty gentoo org> CommitDate: Sat Apr 9 06:13:53 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/libbash.git;a= =3Dcommit;h=3D95c2c86f Improve brace expansion The parser assumed brace expansion could only happen once for a word but this not the case. Writing a{a,b}b{c,d} is valid bash and expands to four words. --- bashast/bashast.g | 15 ++++++--------- bashast/gunit/brace.gunit | 19 +++++++++---------- bashast/gunit/expansions.gunit | 2 +- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/bashast/bashast.g b/bashast/bashast.g index bf07b7f..5214b65 100644 --- a/bashast/bashast.g +++ b/bashast/bashast.g @@ -27,7 +27,6 @@ options tokens{ ARG; ARRAY; - BRACE; BRACE_EXP; COMMAND_SUB; CASE_PATTERN; @@ -111,8 +110,7 @@ bash_command : fname_no_res_word (BLANK+ arg)* -> ^(COMMAND fname_no_res_word arg*); //An argument to a command arg - : brace_expansion - | var_ref + : var_ref | fname | command_sub | var_ref; @@ -144,16 +142,14 @@ redir_op: AMP LESS_THAN -> OP["&<"] | GREATER_THAN | DIGIT redir_op; brace_expansion - : pre=3Dfname? brace post=3Dfname? -> ^(BRACE_EXP ($pre)? brace ($post)= ?); -brace - : LBRACE BLANK* brace_expansion_inside BLANK?RBRACE -> ^(BRACE brace_ex= pansion_inside); + : LBRACE BLANK* brace_expansion_inside BLANK* RBRACE -> ^(BRACE_EXP bra= ce_expansion_inside); brace_expansion_inside : commasep|range; range : DIGIT DOTDOT^ DIGIT | LETTER DOTDOT^ LETTER; brace_expansion_part - : fname - | brace + : brace_expansion + | fname | var_ref | command_sub; commasep: brace_expansion_part(COMMA! brace_expansion_part)+; @@ -388,13 +384,14 @@ no_res_word_part | var_ref | command_sub | arithmetic_expansion + | brace_expansion | dqstr | sqstr | ns_str_part_no_res | SLASH | pattern_match_trigger; //non-quoted string rule, allows expansions -nqstr : (bracket_pattern_match|extended_pattern_match|var_ref|command_su= b|arithmetic_expansion|dqstr|sqstr|(str_part str_part_with_pound*)|patter= n_match_trigger|BANG)+; +nqstr : (bracket_pattern_match|extended_pattern_match|var_ref|command_su= b|arithmetic_expansion|brace_expansion|dqstr|sqstr|(str_part str_part_wit= h_pound*)|pattern_match_trigger|BANG)+; //double quoted string rule, allows expansions dqstr : QUOTE dqstr_part* QUOTE -> ^(DOUBLE_QUOTED_STRING dqstr_part*); dqstr_part diff --git a/bashast/gunit/brace.gunit b/bashast/gunit/brace.gunit index a5a5620..937e594 100644 --- a/bashast/gunit/brace.gunit +++ b/bashast/gunit/brace.gunit @@ -18,14 +18,13 @@ */ gunit bashast; =20 -brace: -"{a,b}"-> (BRACE (STRING a) (STRING b)) -"{a,b,c}" -> (BRACE (STRING a) (STRING b) (STRING c)) -"{a..d}" -> (BRACE (.. a d)) -"{{a,b},c,d}" -> (BRACE (BRACE (STRING a) (STRING b)) (STRING c) (STRING= d)) - brace_expansion: -"{a,b}" -> (BRACE_EXP (BRACE (STRING a) (STRING b))) -"a{b,c}" -> (BRACE_EXP (STRING a) (BRACE (STRING b) (STRING c))) -"{c..d}f" -> (BRACE_EXP (BRACE (.. c d)) (STRING f)) -"z{{a,b},c}" -> (BRACE_EXP (STRING z) (BRACE (BRACE (STRING a) (STRING b= )) (STRING c))) +"{a,b}"-> (BRACE_EXP (STRING a) (STRING b)) +"{a,b,c}" -> (BRACE_EXP (STRING a) (STRING b) (STRING c)) +"{a..d}" -> (BRACE_EXP (.. a d)) +"{{a,b},c,d}" -> (BRACE_EXP (BRACE_EXP (STRING a) (STRING b)) (STRING c)= (STRING d)) + +arg: +"a{b,c}" -> (STRING a (BRACE_EXP (STRING b) (STRING c))) +"{c..d}f" -> (STRING (BRACE_EXP (.. c d)) f) +"a{a,b}b{c,d}" -> (STRING a (BRACE_EXP (STRING a) (STRING b)) b (BRACE_E= XP (STRING c) (STRING d))) diff --git a/bashast/gunit/expansions.gunit b/bashast/gunit/expansions.gu= nit index 2bce986..252c6bf 100644 --- a/bashast/gunit/expansions.gunit +++ b/bashast/gunit/expansions.gunit @@ -19,7 +19,7 @@ gunit bashast; =20 list: -"echo a{b,c,d}" -> (LIST (COMMAND (STRING echo) (BRACE_EXP (STRING a) (B= RACE (STRING b) (STRING c) (STRING d))))) +"echo a{b,c,d}" -> (LIST (COMMAND (STRING echo) (STRING a (BRACE_EXP (ST= RING b) (STRING c) (STRING d))))) "((5+5))" -> (LIST (COMPOUND_ARITH (+ 5 5))) "(( 4 + $asdf ))" -> (LIST (COMPOUND_ARITH (+ 4 (VAR_REF asdf)))) "[[ while=3Dwhile ]] && echo true" -> (LIST (&& (COMPOUND_COND (KEYWORD_= TEST (=3D (STRING while) (STRING while)))) (COMMAND (STRING echo) (STRING= true))))