(<:>) 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
| 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
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
(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