something something tuples
[minfp.git] / parse.icl
index 8dc29af..956ca60 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -17,7 +17,9 @@ import ast
 (<:>) infixl 0 :: a (m [a]) -> m [a] | Functor m
 (<:>) l r = (\xs->[l:xs]) <$> r
 
-:: Token = TTEq | TTSemiColon | TTLambda | TTDot | TTBrackOpen | TTBrackClose | TTBool Bool | TTInt Int | TTOp [Char] | TTIdent [Char]
+:: Token
+       = TTEq | TTSemiColon | TTLambda | TTDot | TTBrackOpen | TTBrackClose
+       | TTComma | TTBool Bool | TTInt Int | TTOp [Char] | TTIdent [Char]
 
 derive gEq Token
 derive gPrint Token
@@ -50,6 +52,7 @@ lex [t:ts]
        | isOp t
                # (i, ts) = span isOp [t:ts]
                | i =: ['='] = TTEq <:> lex ts
+               | i =: [','] = TTComma <:> lex ts
                | i =: ['.'] = TTDot <:> lex ts
                | i =: ['\\'] = TTLambda <:> lex ts
                = TTOp i <:> lex ts
@@ -94,6 +97,7 @@ where
 
        pId = (\(TTIdent i)->i) <$> pTop ? (\t->t=:(TTIdent _))
        pOp = (\(TTOp i)->i) <$> pTop ? (\t->t=:(TTOp _))
+       pBrack p = pToken TTBrackOpen *> p <* pToken TTBrackClose
 
        pFunction :: Parser ([Char], [[Char]], [Token])
        pFunction
@@ -116,8 +120,9 @@ where
                        (map fst $ sortBy (on (<) snd) ifxs)
                $   pChainl (pure App)
                $   Lambda <$ pToken TTLambda <*> pId <* pToken TTDot <*> pExpression
-               <|> Var <$ pToken TTBrackOpen <*> pOp <* pToken TTBrackClose
-               <|> pToken TTBrackOpen *> pExpression <* pToken TTBrackClose
+               <|> pBrack (   Tuple <$> pExpression <* pToken TTComma <*> pExpression
+                              <|> Var <$> pOp
+                              <|> pExpression)
                <|> (\(TTInt i)->Lit (Int i)) <$> pTop ? (\t->t=:(TTInt _))
                <|> (\(TTBool i)->Lit (Bool i)) <$> pTop ? (\t->t=:(TTBool _))
                <|> (\x->Var ['_':x]) <$ pId ? ((==)['code']) <*> pId