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