diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2025-10-04 21:45:02 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-10-05 21:24:13 +0200 |
| commit | 6ee42f58d7293d810a5406d06020e1fdc9bcdaf0 (patch) | |
| tree | cc23366a9d79c7b1dffb8599f103a5472bb80727 /src/Parser | |
| parent | 11e04cd229c132ad7d79cbfd8319fb5a3d5f3cbb (diff) | |
Changelog: Implemented input/output redirection in shell scripts
Diffstat (limited to 'src/Parser')
| -rw-r--r-- | src/Parser/Core.hs | 2 | ||||
| -rw-r--r-- | src/Parser/Shell.hs | 22 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/Parser/Core.hs b/src/Parser/Core.hs index f44e721..786fb2e 100644 --- a/src/Parser/Core.hs +++ b/src/Parser/Core.hs @@ -236,7 +236,7 @@ osymbol str = void $ try $ (string (TL.pack str) <* notFollowedBy operatorChar) wsymbol str = void $ try $ (string (TL.pack str) <* notFollowedBy wordChar) <* sc operatorChar :: (MonadParsec e s m, Token s ~ Char) => m (Token s) -operatorChar = satisfy $ (`elem` ['.', '+', '-', '*', '/', '=']) +operatorChar = satisfy $ (`elem` [ '.', '+', '-', '*', '/', '=', '<', '>', '|' ]) {-# INLINE operatorChar #-} localState :: TestParser a -> TestParser a diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs index ffc8cf1..b575842 100644 --- a/src/Parser/Shell.hs +++ b/src/Parser/Shell.hs @@ -71,9 +71,29 @@ parseTextArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 [ char ' ' >> return " " ] +parseRedirection :: TestParser (Expr ShellArgument) +parseRedirection = choice + [ do + osymbol "<" + fmap ShellRedirectStdin <$> parseTextArgument + , do + osymbol ">" + fmap (ShellRedirectStdout False) <$> parseTextArgument + , do + osymbol ">>" + fmap (ShellRedirectStdout True) <$> parseTextArgument + , do + osymbol "2>" + fmap (ShellRedirectStderr False) <$> parseTextArgument + , do + osymbol "2>>" + fmap (ShellRedirectStderr True) <$> parseTextArgument + ] + parseArgument :: TestParser (Expr ShellArgument) parseArgument = choice - [ fmap ShellArgument <$> parseTextArgument + [ parseRedirection + , fmap ShellArgument <$> parseTextArgument ] parseArguments :: TestParser (Expr [ ShellArgument ]) |