summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-08-02 17:08:59 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-08-02 17:27:34 +0200
commite4a392c1c3089e0ec77601d99cd19be4403bb3a1 (patch)
tree3f8511a8d0232227dcb44ca40af7d47c3706051f
parent07a95fc6138446529384b08ecd1ecc2d54861761 (diff)
Shell: list all shell special characters for parser
-rw-r--r--src/Parser/Shell.hs22
-rw-r--r--test/asset/shell/echo.et2
-rw-r--r--test/script/shell.et2
3 files changed, 14 insertions, 12 deletions
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs
index 37b4e79..7720ee9 100644
--- a/src/Parser/Shell.hs
+++ b/src/Parser/Shell.hs
@@ -29,7 +29,9 @@ parseArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 (:)
, unquotedString
]
where
- specialChars = [ '\"', '\\', '$' ]
+ specialChars = [ '"', '\'', '\\', '$', '#', '|', '>', '<', ';', '[', ']', '{', '}', '(', ')', '*', '?', '~', '&', '!' ]
+
+ stringSpecialChars = [ '"', '\\', '$' ]
unquotedString :: TestParser (Expr Text)
unquotedString = do
@@ -40,7 +42,7 @@ parseArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 (:)
void $ char '"'
let inner = choice
[ char '"' >> return []
- , (:) <$> (Pure . TL.toStrict <$> takeWhile1P Nothing (`notElem` specialChars)) <*> inner
+ , (:) <$> (Pure . TL.toStrict <$> takeWhile1P Nothing (`notElem` stringSpecialChars)) <*> inner
, (:) <$> stringEscapedChar <*> inner
, (:) <$> stringExpansion <*> inner
]
@@ -53,11 +55,9 @@ parseArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 (:)
stringEscapedChar :: TestParser (Expr Text)
stringEscapedChar = do
void $ char '\\'
- Pure <$> choice
- [ char '\\' >> return "\\"
- , char '"' >> return "\""
- , char '$' >> return "$"
- , char 'n' >> return "\n"
+ fmap Pure $ choice $
+ map (\c -> char c >> return (T.singleton c)) stringSpecialChars ++
+ [ char 'n' >> return "\n"
, char 'r' >> return "\r"
, char 't' >> return "\t"
, return "\\"
@@ -66,11 +66,9 @@ parseArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 (:)
standaloneEscapedChar :: TestParser (Expr Text)
standaloneEscapedChar = do
void $ char '\\'
- Pure <$> choice
- [ char '\\' >> return "\\"
- , char '"' >> return "\""
- , char '$' >> return "$"
- , char ' ' >> return " "
+ fmap Pure $ choice $
+ map (\c -> char c >> return (T.singleton c)) specialChars ++
+ [ char ' ' >> return " "
]
parseArguments :: TestParser (Expr [ Text ])
diff --git a/test/asset/shell/echo.et b/test/asset/shell/echo.et
index c2174a0..1e48cac 100644
--- a/test/asset/shell/echo.et
+++ b/test/asset/shell/echo.et
@@ -21,3 +21,5 @@ test Echo:
echo "\""\""a"
echo "'" '"' '\\\' "\\"
echo a\ b\ \ c
+
+ echo \" \' \\ \$ \# \| \> \< \; \[ \] \{ \} \( \) \* \? \~ \& \!
diff --git a/test/script/shell.et b/test/script/shell.et
index 12a5a73..7db19c8 100644
--- a/test/script/shell.et
+++ b/test/script/shell.et
@@ -53,6 +53,8 @@ test ShellEcho:
"' \" \\\\\\ \\"
"a b c"
+ "\" ' \\ \$ # | > < ; [ ] { } ( ) * ? ~ & !"
+
with p:
expect /run-test-result Echo done/
expect /run-all-done/