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
next parent 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).