zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <p.stephenson@samsung.com>
To: Zsh Hackers' List <zsh-workers@zsh.org>
Subject: Re: grammar triviality with '&&'
Date: Wed, 04 Mar 2015 15:18:30 +0000	[thread overview]
Message-ID: <20150304151830.5e20d732@pwslap01u.europe.root.pri> (raw)
In-Reply-To: <20150304144756.GA27231@ypig.lip.ens-lyon.fr>

On Wed, 4 Mar 2015 15:47:56 +0100
Vincent Lefevre <vincent@vinc17.net> wrote:
> I've found a bug:
> 
> % alias '&&=(){ return $? } && '
> % && echo OK
> zsh: parse error near `&&'

(Moved to zsh-workers)

I was keeping very quiet about this, but it looks like it's not as hairy
as I thought it might be and the new code is actually slightly cleaner...

Now waiting for obscure failures elsewhere...

pws

diff --git a/Src/lex.c b/Src/lex.c
index 307b6e9..a076614 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -1728,13 +1728,48 @@ gotword(void)
     }
 }
 
+/* Check if current lex text matches an alias: 1 if so, else 0 */
+
+static int
+checkalias(void)
+{
+    Alias an;
+
+    if (!noaliases && isset(ALIASESOPT) &&
+	(!isset(POSIXALIASES) ||
+	 !reswdtab->getnode(reswdtab, zshlextext))) {
+	char *suf;
+
+	an = (Alias) aliastab->getnode(aliastab, zshlextext);
+	if (an && !an->inuse &&
+	    ((an->node.flags & ALIAS_GLOBAL) || incmdpos || inalmore)) {
+	    inpush(an->text, INP_ALIAS, an);
+	    if (an->text[0] == ' ' && !(an->node.flags & ALIAS_GLOBAL))
+		aliasspaceflag = 1;
+	    lexstop = 0;
+	    return 1;
+	}
+	if ((suf = strrchr(zshlextext, '.')) && suf[1] &&
+	    suf > zshlextext && suf[-1] != Meta &&
+	    (an = (Alias)sufaliastab->getnode(sufaliastab, suf+1)) &&
+	    !an->inuse && incmdpos) {
+	    inpush(dupstring(zshlextext), INP_ALIAS, NULL);
+	    inpush(" ", INP_ALIAS, NULL);
+	    inpush(an->text, INP_ALIAS, an);
+	    lexstop = 0;
+	    return 1;
+	}
+    }
+
+    return 0;
+}
+
 /* expand aliases and reserved words */
 
 /**/
 int
 exalias(void)
 {
-    Alias an;
     Reswd rw;
 
     hwend();
@@ -1746,7 +1781,7 @@ exalias(void)
     if (!tokstr) {
 	zshlextext = tokstrings[tok];
 
-	return 0;
+	return checkalias();
     } else {
 	VARARR(char, copy, (strlen(tokstr) + 1));
 
@@ -1772,34 +1807,10 @@ exalias(void)
 
 	if (tok == STRING) {
 	    /* Check for an alias */
-	    if (!noaliases && isset(ALIASESOPT) &&
-		(!isset(POSIXALIASES) ||
-		 !reswdtab->getnode(reswdtab, zshlextext))) {
-		char *suf;
-
-		an = (Alias) aliastab->getnode(aliastab, zshlextext);
-		if (an && !an->inuse &&
-		    ((an->node.flags & ALIAS_GLOBAL) || incmdpos || inalmore)) {
-		    inpush(an->text, INP_ALIAS, an);
-		    if (an->text[0] == ' ' && !(an->node.flags & ALIAS_GLOBAL))
-			aliasspaceflag = 1;
-		    lexstop = 0;
-		    if (zshlextext == copy)
-			zshlextext = tokstr;
-		    return 1;
-		}
-		if ((suf = strrchr(zshlextext, '.')) && suf[1] &&
-		    suf > zshlextext && suf[-1] != Meta &&
-		    (an = (Alias)sufaliastab->getnode(sufaliastab, suf+1)) &&
-		    !an->inuse && incmdpos) {
-		    inpush(dupstring(zshlextext), INP_ALIAS, NULL);
-		    inpush(" ", INP_ALIAS, NULL);
-		    inpush(an->text, INP_ALIAS, an);
-		    lexstop = 0;
-		    if (zshlextext == copy)
-			zshlextext = tokstr;
-		    return 1;
-		}
+	    if (checkalias()) {
+		if (zshlextext == copy)
+		    zshlextext = tokstr;
+		return 1;
 	    }
 
 	    /* Then check for a reserved word */
diff --git a/Test/A02alias.ztst b/Test/A02alias.ztst
index 7121c50..36dfa24 100644
--- a/Test/A02alias.ztst
+++ b/Test/A02alias.ztst
@@ -42,3 +42,18 @@
   cat <(echo foo | cat)
 0:Alias expansion works at the end of parsed strings
 >foo
+
+  alias '&&=(){ return $?; } && '
+  alias not_the_print_command=print
+  eval 'print This is output
+  && print And so is this
+  && { print And this too; false; }
+  && print But not this
+  && print Nor this
+  true
+  && not_the_print_command And aliases are expanded'
+0:We can now alias special tokens.  Woo hoo.
+>This is output
+>And so is this
+>And this too
+>And aliases are expanded


       reply	other threads:[~2015-03-04 15:28 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <54F33934.2070607@eastlink.ca>
     [not found] ` <13666281425228233@web7o.yandex.ru>
     [not found]   ` <54F345D3.9010204@eastlink.ca>
     [not found]     ` <D0509295-7DA9-4F18-9E3D-D50C0A756998@larryv.me>
     [not found]       ` <20150302022754.GA7449@xvii.vinc17.org>
     [not found]         ` <CABx2=D8efL3X2tfB+_+VweY2yye6EhaMNbJa3b3jJeVMp=7gaQ@mail.gmail.com>
     [not found]           ` <20150302104619.GC6869@xvii.vinc17.org>
     [not found]             ` <20150302110610.2e2c7e86@pwslap01u.europe.root.pri>
     [not found]               ` <CAH+w=7YoHjN85hqOZVywOfYGZqvU74vZrbE84Ln+V2HQi-6nSA@mail.gmail.com>
     [not found]                 ` <20150304144756.GA27231@ypig.lip.ens-lyon.fr>
2015-03-04 15:18                   ` Peter Stephenson [this message]
2015-03-04 21:13                     ` Daniel Shahaf
2015-03-04 22:05                     ` Mikael Magnusson
2015-03-05  9:46                       ` Peter Stephenson
     [not found]                   ` <150304175112.ZM19818@torch.brasslantern.com>
     [not found]                     ` <20150305100638.55631238@pwslap01u.europe.root.pri>
2015-03-05 17:07                       ` Aliasing separators (Re: grammar triviality with '&&') Bart Schaefer
2015-03-05 17:40                         ` Peter Stephenson
2015-03-06  1:42                           ` Bart Schaefer
2015-03-06  4:13                             ` Mikael Magnusson
2015-03-06 16:43                               ` Vincent Lefevre
2015-03-06  9:40                             ` Peter Stephenson
2015-03-06 19:26                               ` Bart Schaefer
2015-03-07 15:52                                 ` Peter Stephenson
2015-03-07 17:18                                   ` Ray Andrews
2015-03-07 21:10                                   ` Bart Schaefer
2015-03-09 11:46                                     ` Vincent Lefevre
2015-03-09 16:33                                       ` Peter Stephenson
2015-03-09 17:03                                         ` Bart Schaefer
2015-03-09 17:39                                           ` Peter Stephenson
2015-03-09 17:47                                           ` Ray Andrews

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150304151830.5e20d732@pwslap01u.europe.root.pri \
    --to=p.stephenson@samsung.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).