on master help sign in
Refactored data declaration to use less lookahead for better errors and

some performance improvement

commitd1b5cb900ff515eeb5a3ec60957d67ce30949999 authorAhmad Salim Al-Sibahi <asal@itu.dk> dateTue 1 Oct 2013, 11:28 (13 years ago) parent336f5da
1 file changed+15−17
src/Idris/Parser.hs+15−17
src/Idris/Parser.hs+15−17
@@ -1963,25 +1963,23 @@ SimpleConstructorList ::=
19631963 ;
19641964-}
19651965data_ :: SyntaxInfo -> IdrisParser PDecl
1966−data_ syn = try (do doc <- option "" (docComment '|')
1967− acc <- optional accessibility
1968− co <- dataI
1969− fc <- getFC
1970− tyn_in <- fnName
1971− lchar ':'
1972− ty <- typeExpr (allowImp syn)
1973− let tyn = expandNS syn tyn_in
1974− option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1975− reserved "where"
1976− cons <- indentedBlock (constructor syn)
1977− accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1978− return $ PData doc syn fc co (PDatadecl tyn ty cons)))
1979− <|> try (do doc <- option "" (docComment '|')
1966+data_ syn = do (doc, acc, co) <- try (do
1967+ doc <- option "" (docComment '|')
19801968 pushIndent
19811969 acc <- optional accessibility
19821970 co <- dataI
1983− fc <- getFC
1984− tyn_in <- fnName
1971+ return (doc, acc, co))
1972+ fc <- getFC
1973+ tyn_in <- fnName
1974+ (do try (lchar ':')
1975+ popIndent
1976+ ty <- typeExpr (allowImp syn)
1977+ let tyn = expandNS syn tyn_in
1978+ option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1979+ reserved "where"
1980+ cons <- indentedBlock (constructor syn)
1981+ accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1982+ return $ PData doc syn fc co (PDatadecl tyn ty cons))) <|> (do
19851983 args <- many name
19861984 let ty = bindArgs (map (const PType) args) PType
19871985 let tyn = expandNS syn tyn_in
@@ -2005,7 +2003,7 @@ data_ syn = try (do doc <- option "" (docComment '|')
20052003 return (doc, x, cty, cfc)) cons
20062004 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
20072005 return $ PData doc syn fc co (PDatadecl tyn ty cons')))
2008− <?> "data type declaration"
2006+ <?> "data type declaration"
20092007 where
20102008 mkPApp :: FC -> PTerm -> [PTerm] -> PTerm
20112009 mkPApp fc t [] = t