Parse ksh nested arrays and warn about var=((

This commit is contained in:
Vidar Holen 2017-04-17 21:00:41 -07:00
parent 5c01b6c7f5
commit 3cf8b9ceab
1 changed files with 9 additions and 2 deletions

View File

@ -2400,6 +2400,9 @@ prop_readAssignmentWord9c= isOk readAssignmentWord "foo= #bar"
prop_readAssignmentWord10= isWarning readAssignmentWord "foo$n=42" prop_readAssignmentWord10= isWarning readAssignmentWord "foo$n=42"
prop_readAssignmentWord11= isOk readAssignmentWord "foo=([a]=b [c] [d]= [e f )" prop_readAssignmentWord11= isOk readAssignmentWord "foo=([a]=b [c] [d]= [e f )"
prop_readAssignmentWord12= isOk readAssignmentWord "a[b <<= 3 + c]='thing'" prop_readAssignmentWord12= isOk readAssignmentWord "a[b <<= 3 + c]='thing'"
prop_readAssignmentWord13= isOk readAssignmentWord "var=( (1 2) (3 4) )"
prop_readAssignmentWord14= isOk readAssignmentWord "var=( 1 [2]=(3 4) )"
prop_readAssignmentWord15= isOk readAssignmentWord "var=(1 [2]=(3 4))"
readAssignmentWord = readAssignmentWordExt True readAssignmentWord = readAssignmentWordExt True
readWellFormedAssignment = readAssignmentWordExt False readWellFormedAssignment = readAssignmentWordExt False
readAssignmentWordExt lenient = try $ do readAssignmentWordExt lenient = try $ do
@ -2459,7 +2462,11 @@ readArrayIndex = do
readArray :: Monad m => SCParser m Token readArray :: Monad m => SCParser m Token
readArray = called "array assignment" $ do readArray = called "array assignment" $ do
id <- getNextId id <- getNextId
opening <- getPosition
char '(' char '('
optional $ do
lookAhead $ char '('
parseProblemAt opening ErrorC 1116 "Missing $ on a $((..)) expression? (or use ( ( for arrays)."
allspacing allspacing
words <- readElement `reluctantlyTill` char ')' words <- readElement `reluctantlyTill` char ')'
char ')' <|> fail "Expected ) to close array assignment" char ')' <|> fail "Expected ) to close array assignment"
@ -2472,9 +2479,9 @@ readArray = called "array assignment" $ do
x <- many1 readArrayIndex x <- many1 readArrayIndex
char '=' char '='
return x return x
value <- readNormalWord <|> nothing value <- readRegular <|> nothing
return $ T_IndexedElement id index value return $ T_IndexedElement id index value
readRegular = readNormalWord readRegular = readArray <|> readNormalWord
nothing = do nothing = do
id <- getNextId id <- getNextId