on master help sign in
Improves parsing of function application expressions
4940097Ahmad Salim Al-Sibahi
src/Idris/ParseExpr.hs+22−33
@@ -190,9 +190,7 @@ extension syn (Rule ssym ptm _)
190{- | Parses a (normal) built-in expression
190{- | Parses a (normal) built-in expression
191@
191@
192InternalExpr ::=
192InternalExpr ::=
193− App
194− | MatchApp
195− | UnifyLog
193+ UnifyLog
196 | RecordType
194 | RecordType
197 | SimpleExpr
195 | SimpleExpr
198 | Lambda
196 | Lambda
@@ -202,14 +200,14 @@ InternalExpr ::=
202 | Pi
200 | Pi
203 | CaseExpr
201 | CaseExpr
204 | DoBlock
202 | DoBlock
203+ | App
204+ | MatchApp
205 ;
205 ;
206@
206@
207-}
207-}
208internalExpr :: SyntaxInfo -> IdrisParser PTerm
208internalExpr :: SyntaxInfo -> IdrisParser PTerm
209internalExpr syn =
209internalExpr syn =
210− try (app syn)
211− <|> try (matchApp syn)
212− <|> unifyLog syn
210+ unifyLog syn
213 <|> try (disamb syn)
211 <|> try (disamb syn)
214 <|> noImplicits syn
212 <|> noImplicits syn
215 <|> recordType syn
213 <|> recordType syn
@@ -220,7 +218,7 @@ internalExpr syn =
220 <|> try (pi syn)
218 <|> try (pi syn)
221 <|> doBlock syn
219 <|> doBlock syn
222 <|> caseExpr syn
220 <|> caseExpr syn
223− <|> simpleExpr syn
221+ <|> app syn
224 <?> "expression"
222 <?> "expression"
225
223
226{- | Parses a case expression
224{- | Parses a case expression
@@ -483,24 +481,6 @@ hsimpleExpr syn =
483 <|> simpleExpr syn
481 <|> simpleExpr syn
484 <?> "expression"
482 <?> "expression"
485
483
486−{- | Parses a matching application expression
487−@
488−MatchApp ::=
489− SimpleExpr '<==' FnName
490− ;
491−@
492−-}
493−matchApp :: SyntaxInfo -> IdrisParser PTerm
494−matchApp syn = do ty <- simpleExpr syn
495− symbol "<=="
496− fc <- getFC
497− f <- fnName
498− return (PLet (sMN 0 "match")
499− ty
500− (PMatchApp fc f)
501− (PRef fc (sMN 0 "match")))
502− <?> "matching application expression"
503−
504{- | Parses a unification log expression
484{- | Parses a unification log expression
505UnifyLog ::=
485UnifyLog ::=
506 '%' 'unifyLog' SimpleExpr
486 '%' 'unifyLog' SimpleExpr
@@ -542,7 +522,11 @@ noImplicits syn = do try (lchar '%' *> reserved "noImplicits")
542@
522@
543App ::=
523App ::=
544 'mkForeign' Arg Arg*
524 'mkForeign' Arg Arg*
525+ | MatchApp
545− | SimpleExpr Arg+
526+ | SimpleExpr Arg*
527+ ;
528+MatchApp ::=
529+ SimpleExpr '<==' FnName
546 ;
530 ;
547@
531@
548-}
532-}
@@ -552,8 +536,6 @@ app syn = do f <- reserved "mkForeign"
552 fn <- arg syn
536 fn <- arg syn
553 args <- many (do notEndApp; arg syn)
537 args <- many (do notEndApp; arg syn)
554 i <- get
538 i <- get
555− -- mkForeign f args ==>
556− -- liftPrimIO (\w => mkForeignPrim f args w)
557 let ap = PApp fc (PRef fc (sUN "liftPrimIO"))
539 let ap = PApp fc (PRef fc (sUN "liftPrimIO"))
558 [pexp (PLam (sMN 0 "w")
540 [pexp (PLam (sMN 0 "w")
559 Placeholder
541 Placeholder
@@ -563,13 +545,20 @@ app syn = do f <- reserved "mkForeign"
563 return (dslify i ap)
545 return (dslify i ap)
564
546
565 <|> do f <- simpleExpr syn
547 <|> do f <- simpleExpr syn
548+ (do try $ symbol "<=="
549+ fc <- getFC
550+ ff <- fnName
551+ return (PLet (sMN 0 "match")
552+ f
553+ (PMatchApp fc ff)
554+ (PRef fc (sMN 0 "match")))
555+ <?> "matching application expression") <|> (do
566 fc <- getFC
556 fc <- getFC
567− args <- some (do notEndApp; arg syn)
568 i <- get
557 i <- get
558+ args <- many (do notEndApp; arg syn)
569−-- case f of
559+ case args of
570−-- PAppBind fc ref [] ->
560+ [] -> return f
571−-- return (dslify i (PAppBind fc ref args))
572− return (dslify i (PApp fc f args))
561+ _ -> return (dslify i (PApp fc f args)))
573 <?> "function application"
562 <?> "function application"
574 where
563 where
575 dslify :: IState -> PTerm -> PTerm
564 dslify :: IState -> PTerm -> PTerm