From 7a0c86835b8bd34c5bbaa0194e298c431d8b2c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 22 Aug 2026 23:19:45 +0200 Subject: Shell: fix parsing of redirection and pipes followed by some symbols --- src/Parser/Shell.hs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src') 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 -- cgit v1.2.3