From dacb8c597fe071e7247f1ffb6b0b819708dc55da Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Wed, 4 Sep 2013 13:02:30 -0700 Subject: [PATCH] Fixed a series of extglob parsing oddities and edge cases --- ShellCheck/Parser.hs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ShellCheck/Parser.hs b/ShellCheck/Parser.hs index b4019e6..a37db0e 100644 --- a/ShellCheck/Parser.hs +++ b/ShellCheck/Parser.hs @@ -789,6 +789,9 @@ prop_readExtglob1 = isOk readExtglob "!(*.mp3)" prop_readExtglob2 = isOk readExtglob "!(*.mp3|*.wmv)" prop_readExtglob4 = isOk readExtglob "+(foo \\) bar)" prop_readExtglob5 = isOk readExtglob "+(!(foo *(bar)))" +prop_readExtglob6 = isOk readExtglob "*(((||))|())" +prop_readExtglob7 = isOk readExtglob "*(<>)" +prop_readExtglob8 = isOk readExtglob "@(|*())" readExtglob = called "extglob" $ do id <- getNextId c <- try $ do @@ -801,8 +804,19 @@ readExtglob = called "extglob" $ do readExtglobPart = do id <- getNextId - x <- many1 (readNormalWordPart "" <|> readSpacePart) + x <- many (readExtglobGroup <|> readNormalWordPart "" <|> readSpacePart <|> readExtglobLiteral) return $ T_NormalWord id x + where + readExtglobGroup = do + id <- getNextId + char '(' + contents <- readExtglobPart `sepBy` (char '|') + char ')' + return $ T_Extglob id "" contents + readExtglobLiteral = do + id <- getNextId + str <- many1 (oneOf "<>#;&") + return $ T_Literal id str readSingleEscaped = do