Preliminary support for "let" syntax

This commit is contained in:
John Wiegley 2014-07-04 02:06:56 -05:00
parent 03d8ccc5bb
commit 3c7025f9f3
2 changed files with 14 additions and 5 deletions

View File

@ -14,6 +14,7 @@ import Nix.Internal
import Nix.Parser.Library
import Prelude hiding (elem)
-- | The lexer for this parser is defined in 'Nix.Parser.Library'.
nixApp :: Parser NExpr
nixApp = go <$>
someTill (whiteSpace *> nixExpr True)
@ -55,6 +56,7 @@ nixTerm allowLambdas = choice
, nixParens
, nixList
, nixPath
, nixLet
, setLambdaStringOrSym allowLambdas
]
@ -76,6 +78,11 @@ nixList = brackets (Fix . NList <$> many (nixTerm False)) <?> "list"
nixPath :: Parser NExpr
nixPath = try $ fmap mkPath $ mfilter ('/' `elem`) $ some (oneOf "A-Za-z_0-9.:/")
nixLet :: Parser NExpr
nixLet = (Fix .) . NLet
<$> (symbol "let" *> nixBinders)
<*> (whiteSpace *> symbol "in" *> nixApp)
-- | This is a bit tricky because we don't know whether we're looking at a set
-- or a lambda until we've looked ahead a bit. And then it may be neither,
-- in which case we fall back to expected a plain string or identifier.
@ -99,7 +106,7 @@ setLambdaStringOrSym allowLambdas = do
else keyName <?> "string"
symName :: Parser Text
symName = pack <$> ((:) <$> letter <*> many (alphaNum <|> char '.'))
symName = pack <$> ((:) <$> letter <*> many (alphaNum <|> oneOf "._"))
stringish :: Parser NExpr
stringish = (char '"' *> (merge <$> manyTill stringChar (char '"')))
@ -124,6 +131,9 @@ argExpr = (Fix . NArgSet . Map.fromList <$> argList)
nvPair :: Parser (NExpr, NExpr)
nvPair = (,) <$> keyName <*> (symbolic '=' *> nixApp)
nixBinders :: Parser [(NExpr, NExpr)]
nixBinders = nvPair `endBy` symbolic ';'
keyName :: Parser NExpr
keyName = (stringish <|> (mkSym <$> symName)) <* whiteSpace
@ -138,8 +148,7 @@ setOrArgs = do
else try (lookAhead lookaheadForSet)
trace ("Do we have a set: " ++ show haveSet) $ return ()
if haveSet
then braces (Fix . NSet sawRec <$> nvPair `endBy` symbolic ';')
<?> "set"
then braces (Fix . NSet sawRec <$> nixBinders) <?> "set"
else do
trace "parsing arguments" $ return ()
args <- argExpr <?> "arguments"

View File

@ -100,7 +100,7 @@ data NExprF r
| NArgSet (Map Text (Maybe r))
| NSet Bool [(r, r)]
| NLet r r
| NLet [(r, r)] r
| NIf r r r
| NWith r r
| NAssert r r
@ -157,7 +157,7 @@ dumpExpr = cata phi where
phi (NList l) = "NList [" ++ show l ++ "]"
phi (NArgSet xs) = "NArgSet " ++ show xs
phi (NSet b xs) = "NSet " ++ show b ++ " " ++ show xs
phi (NLet v e) = "NLet " ++ v ++ " " ++ e
phi (NLet v e) = "NLet " ++ show v ++ " " ++ e
phi (NIf i t e) = "NIf " ++ i ++ " " ++ t ++ " " ++ e
phi (NWith c v) = "NWith " ++ c ++ " " ++ v
phi (NAssert e v) = "NAssert " ++ e ++ " " ++ v