diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-09-05 08:47:43 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-09-06 20:23:58 +0200 |
| commit | a8f93733a9d2df0859d585a11bdd39762f3c37a8 (patch) | |
| tree | d91e465fd94d7626ad5dd9aad1446264ac26a9c8 /src/Parser | |
| parent | a9439b66ad8f7a8f4ba079a47ecfe1e76c2abc4b (diff) | |
Expression expansion for shell command
Diffstat (limited to 'src/Parser')
| -rw-r--r-- | src/Parser/Shell.hs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs index a09eb43..8c8ef46 100644 --- a/src/Parser/Shell.hs +++ b/src/Parser/Shell.hs @@ -107,12 +107,25 @@ parseArguments = do parseCommand :: TestParser (Expr ShellCommand) parseCommand = label "shell statement" $ do line <- getSourceLine - command <- parseTextArgument - args <- parseArguments - return $ ShellCommand - <$> command - <*> args - <*> pure line + choice + [ do + args <- expressionExpansion "shell command" <* sc + args' <- parseArguments + return $ commandFromArgLists line <$> args <*> args' + , do + command <- parseTextArgument + args <- parseArguments + return $ ShellCommand + <$> command + <*> args + <*> pure line + ] + + where + commandFromArgLists line (ShellArguments (ShellArgument cmd : args)) (ShellArguments args') = + ShellCommand cmd (ShellArguments (args ++ args')) line + commandFromArgLists line (ShellArguments args) (ShellArguments args') = + ShellCommand "" (ShellArguments (args ++ args')) line parsePipeline :: Maybe (Expr ShellPipeline) -> TestParser (Expr ShellPipeline) parsePipeline mbupper = do |