Make monadic and dyadic ops use a common node (rather than one per op)

This commit is contained in:
Adam Sampson 2006-10-02 21:23:02 +00:00
parent acb785e85b
commit 42e46b1d23
3 changed files with 67 additions and 73 deletions

View File

@ -398,11 +398,11 @@ occamExponent
expression :: Parser N.Node
expression
= try (do { o <- monadicOperator ; v <- operand ; return $ o v })
= try (do { o <- monadicOperator ; v <- operand ; return $ N.MonadicOp o v })
<|> do { a <- sMOSTPOS ; t <- dataType ; return $ N.MostPos t }
<|> do { a <- sMOSTNEG ; t <- dataType ; return $ N.MostNeg t }
<|> do { a <- sSIZE ; t <- dataType ; return $ N.Size t }
<|> try (do { a <- operand ; o <- dyadicOperator ; b <- operand ; return $ o a b })
<|> try (do { a <- operand ; o <- dyadicOperator ; b <- operand ; return $ N.DyadicOp o a b })
<|> try conversion
<|> operand
<?> "expression"
@ -503,7 +503,7 @@ monadicOperator
<|> do { reservedOp "~" ; return $ N.MonBitNot }
<|> do { sBITNOT ; return $ N.MonBitNot }
<|> do { sNOT ; return $ N.MonNot }
<|> do { sSIZE ; return $ N.Size }
<|> do { sSIZE ; return $ N.MonSize }
<?> "monadicOperator"
name

View File

@ -11,6 +11,36 @@ instance Show SExp where
show (Item s) = s
show (List is) = "(" ++ (concat $ intersperse " " $ map show is) ++ ")"
dyadicName :: N.Node -> String
dyadicName n = case n of
N.Add -> "+"
N.Subtr -> "-"
N.Mul -> "*"
N.Div -> "/"
N.Rem -> "mod"
N.Plus -> "plus"
N.Minus -> "minus"
N.Times -> "times"
N.BitAnd -> "bitand"
N.BitOr -> "bitor"
N.BitXor -> "bitxor"
N.And -> "and"
N.Or -> "or"
N.Eq -> "="
N.NEq -> "<>"
N.Less -> "<"
N.More -> ">"
N.LessEq -> "<="
N.MoreEq -> ">="
N.After -> "after"
monadicName :: N.Node -> String
monadicName n = case n of
N.MonSub -> "-"
N.MonBitNot -> "bitnot"
N.MonNot -> "not"
N.MonSize -> "size"
nodeToSExp :: N.Node -> SExp
nodeToSExp node
= case node of
@ -78,29 +108,8 @@ nodeToSExp node
N.Conv a b -> wrap2 "conv" (top a) (top b)
N.Round a b -> wrap2 "round" (top a) (top b)
N.Trunc a b -> wrap2 "trunc" (top a) (top b)
N.Add a b -> wrap2 "+" (top a) (top b)
N.Subtr a b -> wrap2 "-" (top a) (top b)
N.Mul a b -> wrap2 "*" (top a) (top b)
N.Div a b -> wrap2 "/" (top a) (top b)
N.Rem a b -> wrap2 "mod" (top a) (top b)
N.Plus a b -> wrap2 "plus" (top a) (top b)
N.Minus a b -> wrap2 "minus" (top a) (top b)
N.Times a b -> wrap2 "times" (top a) (top b)
N.BitAnd a b -> wrap2 "bitand" (top a) (top b)
N.BitOr a b -> wrap2 "bitor" (top a) (top b)
N.BitXor a b -> wrap2 "bitxor" (top a) (top b)
N.And a b -> wrap2 "and" (top a) (top b)
N.Or a b -> wrap2 "or" (top a) (top b)
N.Eq a b -> wrap2 "=" (top a) (top b)
N.NEq a b -> wrap2 "<>" (top a) (top b)
N.Less a b -> wrap2 "<" (top a) (top b)
N.More a b -> wrap2 ">" (top a) (top b)
N.LessEq a b -> wrap2 "<=" (top a) (top b)
N.MoreEq a b -> wrap2 ">=" (top a) (top b)
N.After a b -> wrap2 "after" (top a) (top b)
N.MonSub a -> wrap "-" (top a)
N.MonBitNot a -> wrap "bitnot" (top a)
N.MonNot a -> wrap "not" (top a)
N.DyadicOp o a b -> wrap2 (dyadicName o) (top a) (top b)
N.MonadicOp o a -> wrap (monadicName o) (top a)
N.MostPos a -> wrap "mostpos" (top a)
N.MostNeg a -> wrap "mostneg" (top a)
N.Size a -> wrap "size" (top a)
@ -211,29 +220,8 @@ nodeToSOccam node
N.Conv a b -> wrap2 "conv" (top a) (top b)
N.Round a b -> wrap2 "round" (top a) (top b)
N.Trunc a b -> wrap2 "trunc" (top a) (top b)
N.Add a b -> wrap2 "+" (top a) (top b)
N.Subtr a b -> wrap2 "-" (top a) (top b)
N.Mul a b -> wrap2 "*" (top a) (top b)
N.Div a b -> wrap2 "/" (top a) (top b)
N.Rem a b -> wrap2 "mod" (top a) (top b)
N.Plus a b -> wrap2 "plus" (top a) (top b)
N.Minus a b -> wrap2 "minus" (top a) (top b)
N.Times a b -> wrap2 "times" (top a) (top b)
N.BitAnd a b -> wrap2 "bitand" (top a) (top b)
N.BitOr a b -> wrap2 "bitor" (top a) (top b)
N.BitXor a b -> wrap2 "bitxor" (top a) (top b)
N.And a b -> wrap2 "and" (top a) (top b)
N.Or a b -> wrap2 "or" (top a) (top b)
N.Eq a b -> wrap2 "=" (top a) (top b)
N.NEq a b -> wrap2 "<>" (top a) (top b)
N.Less a b -> wrap2 "<" (top a) (top b)
N.More a b -> wrap2 ">" (top a) (top b)
N.LessEq a b -> wrap2 "<=" (top a) (top b)
N.MoreEq a b -> wrap2 ">=" (top a) (top b)
N.After a b -> wrap2 "after" (top a) (top b)
N.MonSub a -> wrap "-" (top a)
N.MonBitNot a -> wrap "bitnot" (top a)
N.MonNot a -> wrap "not" (top a)
N.DyadicOp o a b -> wrap2 (dyadicName o) (top a) (top b)
N.MonadicOp o a -> wrap (monadicName o) (top a)
N.MostPos a -> wrap "mostpos" (top a)
N.MostNeg a -> wrap "mostneg" (top a)
N.Size a -> wrap "size" (top a)

View File

@ -1,4 +1,4 @@
-- Tree datatype and operations
-- occam parse tree
-- This is intended to be imported qualified:
-- import qualified Tree as N
@ -79,29 +79,35 @@ data Node =
| Conv Node Node
| Round Node Node
| Trunc Node Node
| Add Node Node
| Subtr Node Node
| Mul Node Node
| Div Node Node
| Rem Node Node
| Plus Node Node
| Minus Node Node
| Times Node Node
| BitAnd Node Node
| BitOr Node Node
| BitXor Node Node
| And Node Node
| Or Node Node
| Eq Node Node
| NEq Node Node
| Less Node Node
| More Node Node
| LessEq Node Node
| MoreEq Node Node
| After Node Node
| MonSub Node
| MonBitNot Node
| MonNot Node
| DyadicOp Node Node Node
| Add
| Subtr
| Mul
| Div
| Rem
| Plus
| Minus
| Times
| BitAnd
| BitOr
| BitXor
| And
| Or
| Eq
| NEq
| Less
| More
| LessEq
| MoreEq
| After
| MonadicOp Node Node
| MonSub
| MonBitNot
| MonNot
| MonSize
| MostPos Node
| MostNeg Node
| Size Node