diff options
author | June McEnroe <june@causal.agency> | 2022-06-10 21:54:10 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2022-06-10 21:57:20 -0400 |
commit | 1b43cc7aed8a4062ee1ed779ad4d1fcba1d4f894 (patch) | |
tree | 896173c071293730785015e51edbb4c8983c73b3 | |
parent | Switch to jorts Install script (diff) | |
download | src-1b43cc7aed8a4062ee1ed779ad4d1fcba1d4f894.tar.gz src-1b43cc7aed8a4062ee1ed779ad4d1fcba1d4f894.zip |
Handle subshells (and functions) inside substitutions
-rw-r--r-- | bin/sh.l | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/bin/sh.l b/bin/sh.l index 9664b009..8f0f7723 100644 --- a/bin/sh.l +++ b/bin/sh.l @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 C. McEnroe <june@causal.agency> +/* Copyright (C) 2021 June McEnroe <june@causal.agency> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -36,7 +36,7 @@ static int pop(void) { } %} -%s Param Command Arith Backtick +%s Param Command Arith Backtick Subshell %x DQuote HereDocDel HereDoc HereDocLit word [[:alnum:]_.-]+ @@ -51,7 +51,7 @@ reserved [!{}]|else|do|elif|for|done|fi|then|until|while|if|case|esac "\\". { return Escape; } -<INITIAL,DQuote,HereDoc,Param,Command,Arith>{ +<INITIAL,DQuote,HereDoc,Param,Command,Arith,Subshell>{ "$"[*@#?$!0-9-] | "$"[_[:alpha:][_[:alnum:]]* | "${"[#]?{param}"}" { @@ -73,6 +73,10 @@ reserved [!{}]|else|do|elif|for|done|fi|then|until|while|if|case|esac BEGIN(push(Backtick)); return Subst; } + "(" { + BEGIN(push(Subshell)); + return Normal; + } } <Param>"}" | <Command>")" | @@ -81,6 +85,10 @@ reserved [!{}]|else|do|elif|for|done|fi|then|until|while|if|case|esac BEGIN(pop()); return Subst; } +<Subshell>")" { + BEGIN(pop()); + return Normal; +} "\n" { first = true; |