on master help sign in
Just store sorted list of syntax rules
commit4130476d60c28b78c0df3b23fab6b74e07a49e2b authorAlexander Shabalin <shabalyn.a@gmail.com> dateMon 17 Nov 2014, 17:39 (12 years ago) parent1b4bb5f
4 files changed+71−100
src/Idris/AbsSyntaxTree.hs+41−1 src/Idris/IBC.hs−1 src/Idris/ParseExpr.hs+30−93 src/Idris/ParseExpr.hs-boot−5
src/Idris/AbsSyntaxTree.hs+41−1
@@ -12,7 +12,6 @@ import IRTS.Lang
1212import IRTS.CodegenCommon
1313import Util.Pretty
1414import Util.DynamicLinker
15−import {-# SOURCE #-} Idris.ParseExpr (SyntaxRules, emptySyntaxRules)
1615
1716import Idris.Colours
1817
@@ -22,6 +21,7 @@ import System.IO
2221import Control.Monad.Trans.State.Strict
2322import Control.Monad.Trans.Error
2423
24+import Data.Function (on)
2525import Data.List hiding (group)
2626import Data.Char
2727import qualified Data.Map as M
@@ -1007,6 +1007,46 @@ deriving instance Binary SSymbol
10071007deriving instance NFData SSymbol
10081008!-}
10091009
1010+newtype SyntaxRules = SyntaxRules { syntaxRulesList :: [Syntax] }
1011+
1012+emptySyntaxRules :: SyntaxRules
1013+emptySyntaxRules = SyntaxRules []
1014+
1015+updateSyntaxRules :: [Syntax] -> SyntaxRules -> SyntaxRules
1016+updateSyntaxRules rules (SyntaxRules sr) = SyntaxRules newRules
1017+ where
1018+ newRules = sortBy (ruleSort `on` syntaxSymbols) (rules ++ sr)
1019+
1020+ ruleSort [] [] = EQ
1021+ ruleSort [] _ = LT
1022+ ruleSort _ [] = GT
1023+ ruleSort (s1:ss1) (s2:ss2) =
1024+ case symCompare s1 s2 of
1025+ EQ -> ruleSort ss1 ss2
1026+ r -> r
1027+
1028+ -- Better than creating Ord instance for SSymbol since
1029+ -- in general this ordering does not really make sense.
1030+ symCompare (Keyword n1) (Keyword n2) = compare n1 n2
1031+ symCompare (Keyword _) _ = LT
1032+ symCompare (Symbol _) (Keyword _) = GT
1033+ symCompare (Symbol s1) (Symbol s2) = compare s1 s2
1034+ symCompare (Symbol _) _ = LT
1035+ symCompare (Binding _) (Keyword _) = GT
1036+ symCompare (Binding _) (Symbol _) = GT
1037+ symCompare (Binding b1) (Binding b2) = compare b1 b2
1038+ symCompare (Binding _) _ = LT
1039+ symCompare (Expr _) (Keyword _) = GT
1040+ symCompare (Expr _) (Symbol _) = GT
1041+ symCompare (Expr _) (Binding _) = GT
1042+ symCompare (Expr e1) (Expr e2) = compare e1 e2
1043+ symCompare (Expr _) _ = LT
1044+ symCompare (SimpleExpr _) (Keyword _) = GT
1045+ symCompare (SimpleExpr _) (Symbol _) = GT
1046+ symCompare (SimpleExpr _) (Binding _) = GT
1047+ symCompare (SimpleExpr _) (Expr _) = GT
1048+ symCompare (SimpleExpr e1) (SimpleExpr e2) = compare e1 e2
1049+
10101050initDSL = DSL (PRef f (sUN ">>="))
10111051 (PRef f (sUN "return"))
10121052 (PRef f (sUN "<$>"))
src/Idris/IBC.hs−1
@@ -12,7 +12,6 @@ import Idris.Error
1212import Idris.Delaborate
1313import qualified Idris.Docstrings as D
1414import Idris.Docstrings (Docstring)
15−import Idris.ParseExpr (updateSyntaxRules)
1615import Idris.Output
1716
1817import qualified Cheapskate.Types as CT
src/Idris/ParseExpr.hs+30−93
@@ -35,51 +35,6 @@ import qualified Data.ByteString.UTF8 as UTF8
3535
3636import Debug.Trace
3737
38−data SyntaxRules = SyntaxRules
39− { rules_rules :: [Syntax]
40− , rules_parserPattern :: (SyntaxInfo -> IdrisParser PTerm)
41− , rules_parserTerm :: (SyntaxInfo -> IdrisParser PTerm)
42− , rules_parserSimplePattern :: (SyntaxInfo -> IdrisParser PTerm)
43− , rules_parserSimpleTerm :: (SyntaxInfo -> IdrisParser PTerm)
44− }
45−
46−emptySyntaxRules :: SyntaxRules
47−emptySyntaxRules = SyntaxRules
48− { rules_rules = []
49− , rules_parserPattern = const empty
50− , rules_parserTerm = const empty
51− , rules_parserSimplePattern = const empty
52− , rules_parserSimpleTerm = const empty
53− }
54−
55−updateSyntaxRules :: [Syntax] -> SyntaxRules -> SyntaxRules
56−updateSyntaxRules rules sr = sr
57− { rules_rules = newRules
58− , rules_parserPattern = \syn -> extensions syn $ filter isPattern newRules
59− , rules_parserTerm = \syn -> extensions syn $ filter isTerm newRules
60− , rules_parserSimplePattern = \syn ->
61− extensions syn $ filter isPattern $ filter isSimple $ newRules
62− , rules_parserSimpleTerm = \syn ->
63− extensions syn $ filter isTerm $ filter isSimple $ newRules
64− }
65− where
66− newRules = rules ++ rules_rules sr
67− isSimple (Rule (Expr x:xs) _ _) = False
68− isSimple (Rule (SimpleExpr x:xs) _ _) = False
69− isSimple (Rule [Keyword _] _ _) = True
70− isSimple (Rule [Symbol _] _ _) = True
71− isSimple (Rule (_:xs) _ _) = case last xs of
72− Keyword _ -> True
73− Symbol _ -> True
74− _ -> False
75− isSimple _ = False
76− isPattern (Rule _ _ AnySyntax) = True
77− isPattern (Rule _ _ PatternSyntax) = True
78− isPattern _ = False
79− isTerm (Rule _ _ AnySyntax) = True
80− isTerm (Rule _ _ TermSyntax) = True
81− isTerm _ = False
82−
8338-- | Allow implicit type declarations
8439allowImp :: SyntaxInfo -> SyntaxInfo
8540allowImp syn = syn { implicitAllowed = True }
@@ -137,69 +92,51 @@ expr' syn = try (externalExpr syn)
13792{- | Parses a user-defined expression -}
13893externalExpr :: SyntaxInfo -> IdrisParser PTerm
13994externalExpr syn = do i <- get
140− if inPattern syn
141− then rules_parserPattern (syntax_rules i) syn
142− else rules_parserTerm (syntax_rules i) syn
95+ extensions syn (syntaxRulesList $ syntax_rules i)
14396 <?> "user-defined expression"
14497
14598{- | Parses a simple user-defined expression -}
14699simpleExternalExpr :: SyntaxInfo -> IdrisParser PTerm
147100simpleExternalExpr syn = do i <- get
148− if inPattern syn
149− then rules_parserSimplePattern (syntax_rules i) syn
150− else rules_parserSimpleTerm (syntax_rules i) syn
151−
152−data SynMatch = SynTm PTerm | SynBind Name
101+ extensions syn (filter isSimple (syntaxRulesList $ syntax_rules i))
102+ where
103+ isSimple (Rule (Expr x:xs) _ _) = False
104+ isSimple (Rule (SimpleExpr x:xs) _ _) = False
105+ isSimple (Rule [Keyword _] _ _) = True
106+ isSimple (Rule [Symbol _] _ _) = True
107+ isSimple (Rule (_:xs) _ _) = case last xs of
108+ Keyword _ -> True
109+ Symbol _ -> True
110+ _ -> False
111+ isSimple _ = False
153112
154113{- | Tries to parse a user-defined expression given a list of syntactic extensions -}
155114extensions :: SyntaxInfo -> [Syntax] -> IdrisParser PTerm
156−extensions syn rules = extension [] (sortBy (ruleSort `on` syntaxSymbols) rules)
115+extensions syn rules = extension syn [] (filter isValid rules)
157116 <?> "user-defined expression"
158117 where
159− extension ns rules =
160− choice $ flip map (groupBy (ruleGroup `on` syntaxSymbols) rules) $ \rs ->
161− case head rs of -- can never be []
162− Rule (symb:_) _ _ -> try $ do
163− n <- extensionSymbol symb
164− extension (n : ns) [Rule ss t ctx | (Rule (_:ss) t ctx) <- rs]
165− -- If we have more than one Rule in this bucket, our grammar is
166− -- nondeterministic.
167− Rule [] ptm _ -> return (flatten (update (mapMaybe id ns) ptm))
118+ isValid :: Syntax -> Bool
119+ isValid (Rule _ _ AnySyntax) = True
120+ isValid (Rule _ _ PatternSyntax) = inPattern syn
121+ isValid (Rule _ _ TermSyntax) = not (inPattern syn)
122+
123+data SynMatch = SynTm PTerm | SynBind Name
168124
125+extension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] -> IdrisParser PTerm
126+extension syn ns rules =
127+ choice $ flip map (groupBy (ruleGroup `on` syntaxSymbols) rules) $ \rs ->
128+ case head rs of -- can never be []
129+ Rule (symb:_) _ _ -> try $ do
130+ n <- extensionSymbol symb
131+ extension syn (n : ns) [Rule ss t ctx | (Rule (_:ss) t ctx) <- rs]
132+ -- If we have more than one Rule in this bucket, our grammar is
133+ -- nondeterministic.
134+ Rule [] ptm _ -> return (flatten (update (mapMaybe id ns) ptm))
135+ where
169136 ruleGroup [] [] = True
170137 ruleGroup (s1:_) (s2:_) = s1 == s2
171138 ruleGroup _ _ = False
172139
173− ruleSort [] [] = EQ
174− ruleSort [] _ = LT
175− ruleSort _ [] = GT
176− ruleSort (s1:ss1) (s2:ss2) =
177− case symCompare s1 s2 of
178− EQ -> ruleSort ss1 ss2
179− r -> r
180−
181− -- Better than creating Ord instance for SSymbol since
182− -- in general this ordering does not really make sense.
183− symCompare (Keyword n1) (Keyword n2) = compare n1 n2
184− symCompare (Keyword _) _ = LT
185− symCompare (Symbol _) (Keyword _) = GT
186− symCompare (Symbol s1) (Symbol s2) = compare s1 s2
187− symCompare (Symbol _) _ = LT
188− symCompare (Binding _) (Keyword _) = GT
189− symCompare (Binding _) (Symbol _) = GT
190− symCompare (Binding b1) (Binding b2) = compare b1 b2
191− symCompare (Binding _) _ = LT
192− symCompare (Expr _) (Keyword _) = GT
193− symCompare (Expr _) (Symbol _) = GT
194− symCompare (Expr _) (Binding _) = GT
195− symCompare (Expr e1) (Expr e2) = compare e1 e2
196− symCompare (Expr _) _ = LT
197− symCompare (SimpleExpr _) (Keyword _) = GT
198− symCompare (SimpleExpr _) (Symbol _) = GT
199− symCompare (SimpleExpr _) (Binding _) = GT
200− symCompare (SimpleExpr _) (Expr _) = GT
201− symCompare (SimpleExpr e1) (SimpleExpr e2) = compare e1 e2
202−
203140 extensionSymbol :: SSymbol -> IdrisParser (Maybe (Name, SynMatch))
204141 extensionSymbol (Keyword n) = do reserved (show n); return Nothing
205142 extensionSymbol (Expr n) = do tm <- expr syn
src/Idris/ParseExpr.hs-bootdeleted−5
@@ -1,5 +0,0 @@
1−module Idris.ParseExpr where
2−
3−data SyntaxRules
4−
5−emptySyntaxRules :: SyntaxRules