The ``:-oper add`` pragma takes three arguments: the fixity, priority, and
lexeme that makes up the operator. Fixities are specified as ``pre``,
-``post`` or ``in``. Priorities are natural numbers, with higher numbers
-binding tighter. Lexemes are either bare words or singly-quoted functors.
+``post`` or ``in``. In the case of ``in``, one of ``left``, ``right``, or
+``non`` must be specified for the associativity. Priorities are natural
+numbers, with higher numbers binding tighter. Lexemes are either bare words
+or singly-quoted functors.
Examples::
- :-oper add in 6 + .
+ :-oper add in left 6 + .
:-oper add pre 9 - .
Removing an operator
import Dyna.ParserHS.Types
import Dyna.Term.SurfaceSyntax
import Dyna.Term.TTerm
+import Dyna.XXX.DataUtils
import Dyna.XXX.Trifecta (prettySpanLoc)
import Text.Parser.LookAhead
import Text.Trifecta
$ M.lookup n mm
pcsProcPragma (PRuleIx r :~ _) = pcs_ruleix .= r
-pcsProcPragma (p@(POperAdd _ _ _) :~ s) = sorryPragma p s
-pcsProcPragma (p@(POperDel _) :~ s) = sorryPragma p s
+pcsProcPragma (POperAdd fx prec sym :~ _) = do
+ pcs_operspec %= mapInOrCons (BU.toString sym) (prec,fx)
+ update_pcs_ot
+pcsProcPragma (POperDel sym :~ _) = do
+ pcs_operspec %= M.filterWithKey (\k _ -> k /= (BU.toString sym))
+ update_pcs_ot
+
+sorryPragma :: Pragma -> Span -> a
sorryPragma p s = dynacSorry $ "Cannot handle pragma"
PP.<//> (PP.text $ show p)
PP.<//> "at"
-- dual purpose as an operator and rule separator.
-- Comma similarly has special handling due to its
-- nature as term and subgoal separator.
-dynaOperStyle :: TokenParsing m => IdentifierStyle m
+dynaOperStyle :: (TokenParsing m, Monad m) => IdentifierStyle m
dynaOperStyle = IdentifierStyle
{ _styleName = "Infix Operator"
, _styleStart = oneOfSet $ usualpunct CS.\\ CS.fromList ".,"
- , _styleLetter = oneOfSet $ usualpunct
+ , _styleLetter = oneOfSet (usualpunct CS.\\ CS.fromList ".")
, _styleReserved = mempty
, _styleHighlight = Operator
, _styleReservedHighlight = ReservedOperator
<* symbol "=="
<*> parseInst
- parseOper = choice [ try $ symbol "add" *> parseOperAdd
- , try $ symbol "del" *> parseOperDel
+ parseOper = choice [ symbol "add" *> parseOperAdd
+ , symbol "del" *> parseOperDel
, parseOperAdd
]
parseOperAdd = do
(fx,n) <- fixity
prec <- natural
+ when (prec > fromIntegral (maxBound :: Int))
+ $ unexpected "huge number"
sym <- n
- return $ POperAdd fx prec sym
+ return $ POperAdd fx (fromIntegral prec) sym
parseOperDel = POperDel <$> afx
ParsedModeInst
-- ^ Declare a mode: name, input, and output
- | POperAdd Fixity Integer B.ByteString
+ | POperAdd Fixity Int B.ByteString
-- ^ Add an operator
| POperDel B.ByteString