Let is working, next is "if" syntax
This commit is contained in:
parent
3c7025f9f3
commit
bb3648cf73
|
@ -80,8 +80,8 @@ 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)
|
||||
<$> (reserved "let" *> nixBinders)
|
||||
<*> (whiteSpace *> reserved "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,
|
||||
|
@ -89,14 +89,14 @@ nixLet = (Fix .) . NLet
|
|||
setLambdaStringOrSym :: Bool -> Parser NExpr
|
||||
setLambdaStringOrSym allowLambdas = do
|
||||
trace "setLambdaStringOrSym" $ return ()
|
||||
x <- try (lookAhead symName)
|
||||
x <- try (lookAhead identifier)
|
||||
<|> try (lookAhead (singleton <$> char '{'))
|
||||
<|> return ""
|
||||
if x == "rec" || x == "{"
|
||||
then setOrArgs
|
||||
else do
|
||||
trace "might still have a lambda" $ return ()
|
||||
y <- try (lookAhead (True <$ (symName *> whiteSpace *> symbolic ':')))
|
||||
y <- try (lookAhead (True <$ (identifier *> whiteSpace *> symbolic ':')))
|
||||
<|> return False
|
||||
trace ("results are = " ++ show y) $ return ()
|
||||
if y
|
||||
|
@ -105,9 +105,6 @@ setLambdaStringOrSym allowLambdas = do
|
|||
else error "Unexpected lambda"
|
||||
else keyName <?> "string"
|
||||
|
||||
symName :: Parser Text
|
||||
symName = pack <$> ((:) <$> letter <*> many (alphaNum <|> oneOf "._"))
|
||||
|
||||
stringish :: Parser NExpr
|
||||
stringish = (char '"' *> (merge <$> manyTill stringChar (char '"')))
|
||||
<|> (char '$' *> braces nixApp)
|
||||
|
@ -120,12 +117,12 @@ stringish = (char '"' *> (merge <$> manyTill stringChar (char '"')))
|
|||
|
||||
argExpr :: Parser NExpr
|
||||
argExpr = (Fix . NArgSet . Map.fromList <$> argList)
|
||||
<|> ((mkSym <$> symName) <?> "argname")
|
||||
<|> ((mkSym <$> identifier) <?> "argname")
|
||||
where
|
||||
argList = braces ((argName <* whiteSpace) `sepBy` symbolic ',')
|
||||
<?> "arglist"
|
||||
|
||||
argName = (,) <$> (symName <* whiteSpace)
|
||||
argName = (,) <$> (identifier <* whiteSpace)
|
||||
<*> optional (symbolic '?' *> nixExpr False)
|
||||
|
||||
nvPair :: Parser (NExpr, NExpr)
|
||||
|
@ -135,12 +132,12 @@ nixBinders :: Parser [(NExpr, NExpr)]
|
|||
nixBinders = nvPair `endBy` symbolic ';'
|
||||
|
||||
keyName :: Parser NExpr
|
||||
keyName = (stringish <|> (mkSym <$> symName)) <* whiteSpace
|
||||
keyName = (stringish <|> (mkSym <$> identifier)) <* whiteSpace
|
||||
|
||||
setOrArgs :: Parser NExpr
|
||||
setOrArgs = do
|
||||
trace "setOrArgs" $ return ()
|
||||
sawRec <- try (symbol "rec" *> pure True) <|> pure False
|
||||
sawRec <- try (reserved "rec" *> pure True) <|> pure False
|
||||
trace ("Do we have sawRec: " ++ show sawRec) $ return ()
|
||||
haveSet <-
|
||||
if sawRec
|
||||
|
|
|
@ -2,12 +2,13 @@
|
|||
|
||||
module Nix.Parser.Library ( module Nix.Parser.Library, module X ) where
|
||||
|
||||
import Control.Applicative
|
||||
import Control.Applicative
|
||||
|
||||
#if USE_PARSEC
|
||||
|
||||
import Control.Monad
|
||||
import Control.Monad.IO.Class
|
||||
import Data.Text as T
|
||||
import Data.Text.IO as T
|
||||
import Text.Parsec as X hiding ((<|>), many, optional)
|
||||
import Text.Parsec.Expr as X
|
||||
|
@ -22,7 +23,7 @@ lexer = P.makeTokenParser P.LanguageDef
|
|||
, P.commentLine = "#"
|
||||
, P.nestedComments = True
|
||||
, P.identStart = letter <|> char '_'
|
||||
, P.identLetter = alphaNum <|> char '_'
|
||||
, P.identLetter = alphaNum <|> oneOf "_."
|
||||
, P.opStart = oneOf ":!#$%&*+./<=>?@\\^|-~"
|
||||
, P.opLetter = oneOf "@"
|
||||
, P.reservedNames =
|
||||
|
@ -49,8 +50,14 @@ brackets = P.brackets lexer
|
|||
braces :: Parser a -> Parser a
|
||||
braces = P.braces lexer
|
||||
|
||||
symbol :: String -> Parser String
|
||||
symbol str = string str <* whiteSpace
|
||||
identifier :: Parser Text
|
||||
identifier = pack <$> P.identifier lexer
|
||||
|
||||
reserved :: String -> Parser ()
|
||||
reserved = P.reserved lexer
|
||||
|
||||
symbol :: String -> Parser Text
|
||||
symbol str = pack <$> P.symbol lexer str
|
||||
|
||||
symbolic :: Char -> Parser Char
|
||||
symbolic c = char c <* whiteSpace
|
||||
|
|
|
@ -8,6 +8,7 @@ cabal.mkDerivation (self: rec {
|
|||
src = ./.;
|
||||
isLibrary = true;
|
||||
isExecutable = true;
|
||||
noHaddock = true;
|
||||
buildDepends = [
|
||||
ansiWlPprint
|
||||
text
|
||||
|
|
Loading…
Reference in New Issue