on master help sign in
fix ConstructedAtom parsing of spaces
commit287f51b940e7d44b35cb0becf4fecb3c3749cb63 authorAgentM <agentm@themactionfaction.com> dateSun 20 Mar 2016, 20:45 (11 years ago) parentc0554e0
2 files changed+15−10
TutorialD/Interpreter/RelationalExpr.hs+11−7 TutorialD/Interpreter/Types.hs+4−3
TutorialD/Interpreter/RelationalExpr.hs+11−7
@@ -176,8 +176,12 @@ attributeExtendTupleExpressionP = do
176176 return $ AttributeExtendTupleExpr (T.pack newAttr) atom
177177
178178atomExprP :: Parser AtomExpr
179−atomExprP = try functionAtomExprP <|>
180− try constructedAtomExprP <|>
179+atomExprP = consumeAtomExprP True
180+
181+consumeAtomExprP :: Bool -> Parser AtomExpr
182+consumeAtomExprP consume = try functionAtomExprP <|>
183+ try (parens (constructedAtomExprP True)) <|>
184+ constructedAtomExprP consume <|>
181185 attributeAtomExprP <|>
182186 nakedAtomExprP <|>
183187 relationalAtomExprP
@@ -191,12 +195,12 @@ attributeAtomExprP = do
191195nakedAtomExprP :: Parser AtomExpr
192196nakedAtomExprP = NakedAtomExpr <$> atomP
193197
194−constructedAtomExprP :: Parser AtomExpr
195−constructedAtomExprP = do
196− dConsName <- capitalizedIdentifier
197− dConsArgs <- sepBy atomExprP spaces
198+constructedAtomExprP :: Bool -> Parser AtomExpr
199+constructedAtomExprP consume = do
200+ dConsName <- capitalizedIdentifier
201+ dConsArgs <- if consume then sepBy (consumeAtomExprP False) spaces else pure []
198202 pure $ ConstructedAtomExpr (T.pack dConsName) dConsArgs
199−
203+
200204-- used only for primitive type parsing ?
201205atomP :: Parser Atom
202206atomP = stringAtomP <|>
TutorialD/Interpreter/Types.hs+4−3
@@ -20,25 +20,26 @@ typeVarNamesP = do
2020
2121-- data Either a b = *Left a* | *Right b*
2222dataConstructorDefP :: Parser DataConstructorDef
23−dataConstructorDefP = DataConstructorDef <$> liftM T.pack identifier <*> many dataConstructorDefArgP
23+dataConstructorDefP = DataConstructorDef <$> liftM T.pack capitalizedIdentifier <*> many dataConstructorDefArgP
2424
2525-- data *Either a b* = Left *a* | Right *b*
2626dataConstructorDefArgP :: Parser DataConstructorDefArg
2727dataConstructorDefArgP = parens (DataConstructorDefTypeConstructorArg <$> typeConstructorP) <|>
28+ DataConstructorDefTypeConstructorArg <$> typeConstructorP <|>
2829 DataConstructorDefTypeVarNameArg <$> liftM T.pack uncapitalizedIdentifier
2930
3031--built-in, nullary type constructors
3132-- Int, Text, etc.
3233primitiveTypeConstructorP :: Parser TypeConstructor
3334primitiveTypeConstructorP = choice (map (\(PrimitiveTypeConstructorDef name typ, _) -> do
34− tName <- liftM T.pack (symbol (T.unpack name))
35+ tName <- try $ liftM T.pack (symbol (T.unpack name))
3536 pure $ PrimitiveTypeConstructor tName typ)
3637 primitiveTypeConstructorMapping)
3738
3839-- *Either Int Text*, *Int*
3940typeConstructorP :: Parser TypeConstructor
4041typeConstructorP = primitiveTypeConstructorP <|>
41− ADTypeConstructor <$> liftM T.pack identifier <*> many typeConstructorArgP
42+ ADTypeConstructor <$> liftM T.pack capitalizedIdentifier <*> many typeConstructorArgP
4243
4344typeConstructorArgP :: Parser TypeConstructorArg
4445typeConstructorArgP = TypeConstructorArg <$> typeConstructorP <|>