diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-22 23:19:45 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-22 23:19:45 +0200 |
| commit | 7a0c86835b8bd34c5bbaa0194e298c431d8b2c05 (patch) | |
| tree | eed0a5bba816a6581d5c20f25e16d289d142def2 /src | |
| parent | 9fb76c74b5d30b592bad60de5955b9efa2e6cd65 (diff) | |
Shell: fix parsing of redirection and pipes followed by some symbols
Diffstat (limited to 'src')
| -rw-r--r-- | src/Parser/Shell.hs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs index 105edfa..c6c2a40 100644 --- a/src/Parser/Shell.hs +++ b/src/Parser/Shell.hs @@ -71,21 +71,23 @@ parseTextArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 parseRedirection :: TestParser (Expr ShellArgument) parseRedirection = choice [ do - osymbol "<" + rsymbol "<" fmap ShellRedirectStdin <$> parseTextArgument , do - osymbol ">" + rsymbol ">" fmap (ShellRedirectStdout False) <$> parseTextArgument , do - osymbol ">>" + rsymbol ">>" fmap (ShellRedirectStdout True) <$> parseTextArgument , do - osymbol "2>" + rsymbol "2>" fmap (ShellRedirectStderr False) <$> parseTextArgument , do - osymbol "2>>" + rsymbol "2>>" fmap (ShellRedirectStderr True) <$> parseTextArgument ] + where + rsymbol str = void $ try $ (string str <* notFollowedBy (satisfy $ (`elem` [ '<', '>', '|' ]))) <* sc parseArgument :: TestParser (Expr ShellArgument) parseArgument = choice @@ -115,12 +117,14 @@ parsePipeline mbupper = do Just upper -> liftA2 (\ecmd eupper -> ShellPipeline ecmd (Just eupper)) cmd upper choice [ do - osymbol "|" + psymbol "|" parsePipeline (Just pipeline) , do return pipeline ] + where + psymbol str = void $ try $ (string str <* notFollowedBy (satisfy $ (`elem` [ '<', '>', '|', '&' ]))) <* sc parseStatement :: TestParser (Expr [ ShellStatement ]) parseStatement = do |