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 :: Parser N.Node
expression 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 <- sMOSTPOS ; t <- dataType ; return $ N.MostPos t }
<|> do { a <- sMOSTNEG ; t <- dataType ; return $ N.MostNeg t } <|> do { a <- sMOSTNEG ; t <- dataType ; return $ N.MostNeg t }
<|> do { a <- sSIZE ; t <- dataType ; return $ N.Size 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 <|> try conversion
<|> operand <|> operand
<?> "expression" <?> "expression"
@ -503,7 +503,7 @@ monadicOperator
<|> do { reservedOp "~" ; return $ N.MonBitNot } <|> do { reservedOp "~" ; return $ N.MonBitNot }
<|> do { sBITNOT ; return $ N.MonBitNot } <|> do { sBITNOT ; return $ N.MonBitNot }
<|> do { sNOT ; return $ N.MonNot } <|> do { sNOT ; return $ N.MonNot }
<|> do { sSIZE ; return $ N.Size } <|> do { sSIZE ; return $ N.MonSize }
<?> "monadicOperator" <?> "monadicOperator"
name name

View File

@ -11,6 +11,36 @@ instance Show SExp where
show (Item s) = s show (Item s) = s
show (List is) = "(" ++ (concat $ intersperse " " $ map show is) ++ ")" 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 :: N.Node -> SExp
nodeToSExp node nodeToSExp node
= case node of = case node of
@ -78,29 +108,8 @@ nodeToSExp node
N.Conv a b -> wrap2 "conv" (top a) (top b) N.Conv a b -> wrap2 "conv" (top a) (top b)
N.Round a b -> wrap2 "round" (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.Trunc a b -> wrap2 "trunc" (top a) (top b)
N.Add a b -> wrap2 "+" (top a) (top b) N.DyadicOp o a b -> wrap2 (dyadicName o) (top a) (top b)
N.Subtr a b -> wrap2 "-" (top a) (top b) N.MonadicOp o a -> wrap (monadicName o) (top a)
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.MostPos a -> wrap "mostpos" (top a) N.MostPos a -> wrap "mostpos" (top a)
N.MostNeg a -> wrap "mostneg" (top a) N.MostNeg a -> wrap "mostneg" (top a)
N.Size a -> wrap "size" (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.Conv a b -> wrap2 "conv" (top a) (top b)
N.Round a b -> wrap2 "round" (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.Trunc a b -> wrap2 "trunc" (top a) (top b)
N.Add a b -> wrap2 "+" (top a) (top b) N.DyadicOp o a b -> wrap2 (dyadicName o) (top a) (top b)
N.Subtr a b -> wrap2 "-" (top a) (top b) N.MonadicOp o a -> wrap (monadicName o) (top a)
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.MostPos a -> wrap "mostpos" (top a) N.MostPos a -> wrap "mostpos" (top a)
N.MostNeg a -> wrap "mostneg" (top a) N.MostNeg a -> wrap "mostneg" (top a)
N.Size a -> wrap "size" (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: -- This is intended to be imported qualified:
-- import qualified Tree as N -- import qualified Tree as N
@ -79,29 +79,35 @@ data Node =
| Conv Node Node | Conv Node Node
| Round Node Node | Round Node Node
| Trunc Node Node | Trunc Node Node
| Add Node Node
| Subtr Node Node | DyadicOp Node Node Node
| Mul Node Node | Add
| Div Node Node | Subtr
| Rem Node Node | Mul
| Plus Node Node | Div
| Minus Node Node | Rem
| Times Node Node | Plus
| BitAnd Node Node | Minus
| BitOr Node Node | Times
| BitXor Node Node | BitAnd
| And Node Node | BitOr
| Or Node Node | BitXor
| Eq Node Node | And
| NEq Node Node | Or
| Less Node Node | Eq
| More Node Node | NEq
| LessEq Node Node | Less
| MoreEq Node Node | More
| After Node Node | LessEq
| MonSub Node | MoreEq
| MonBitNot Node | After
| MonNot Node
| MonadicOp Node Node
| MonSub
| MonBitNot
| MonNot
| MonSize
| MostPos Node | MostPos Node
| MostNeg Node | MostNeg Node
| Size Node | Size Node