@@ -21,6 +21,7 @@ import System.IO
2121import Control.Monad.Trans.State.Strict
2222import Control.Monad.Trans.Error
2323
24+import Data.Function (on)
2425import Data.List hiding (group)
2526import Data.Char
2627import qualified Data.Map as M
@@ -177,7 +178,7 @@ data IState = IState {
177178 idris_metavars :: [(Name, (Maybe Name, Int, Bool))], -- ^ The currently defined but not proven metavariables
178179 idris_coercions :: [Name],
179180 idris_errRev :: [(Term, Term)],
180− syntax_rules :: [Syntax],
181+ syntax_rules :: SyntaxRules,
181182 syntax_keywords :: [String],
182183 imported :: [FilePath], -- ^ The imported modules
183184 idris_scprims :: [(Name, (Int, PrimFn))],
@@ -290,7 +291,7 @@ idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
290291 emptyContext emptyContext emptyContext emptyContext
291292 emptyContext emptyContext emptyContext emptyContext
292293 emptyContext emptyContext emptyContext emptyContext
293− [] [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] []
294+ [] [] [] defaultOpts 6 [] [] [] [] emptySyntaxRules [] [] [] [] [] [] []
294295 [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] []
295296 (RawOutput stdout) True defaultTheme [] (0, emptyContext) emptyContext M.empty
296297 AutomaticWidth S.empty Nothing Nothing []
@@ -985,6 +986,9 @@ syntaxNames :: Syntax -> [Name]
985986syntaxNames (Rule syms _ _) = mapMaybe ename syms
986987 where ename (Keyword n) = Just n
987988 ename _ = Nothing
989+
990+syntaxSymbols :: Syntax -> [SSymbol]
991+syntaxSymbols (Rule ss _ _) = ss
988992{-!
989993deriving instance Binary Syntax
990994deriving instance NFData Syntax
@@ -995,7 +999,7 @@ data SSymbol = Keyword Name
995999 | Binding Name
9961000 | Expr Name
9971001 | SimpleExpr Name
998− deriving Show
1002+ deriving (Show, Eq)
9991003
10001004
10011005{-!
@@ -1003,6 +1007,46 @@ deriving instance Binary SSymbol
10031007deriving instance NFData SSymbol
10041008!-}
10051009
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+
10061050initDSL = DSL (PRef f (sUN ">>="))
10071051 (PRef f (sUN "return"))
10081052 (PRef f (sUN "<$>"))