summaryrefslogtreecommitdiff
path: root/src
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 /src
parent07a95fc6138446529384b08ecd1ecc2d54861761 (diff)
Shell: list all shell special characters for parser
Diffstat (limited to 'src')
-rw-r--r--src/Parser/Shell.hs22
1 files changed, 10 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 ])