37 lines
1.2 KiB
Haskell
37 lines
1.2 KiB
Haskell
module AbstractSyntaxTree where
|
|
|
|
import qualified Parser
|
|
|
|
type AST = Node
|
|
|
|
data Node = Operation Opcode Node Node
|
|
| Scalar Int
|
|
deriving Show
|
|
|
|
data Opcode = Add
|
|
| Sub
|
|
| Mult
|
|
| Div
|
|
deriving Show
|
|
|
|
createAST :: Parser.CST -> AST
|
|
createAST = simplifyExpr
|
|
|
|
simplifyExpr :: Parser.Expr -> Node
|
|
simplifyExpr expr = case expr of
|
|
Parser.Add term expr2 -> Operation Add (simplifyTerm term) (simplifyExpr expr2)
|
|
Parser.Sub term expr2 -> Operation Sub (simplifyTerm term) (simplifyExpr expr2)
|
|
Parser.ETerm term -> simplifyTerm term
|
|
|
|
simplifyTerm :: Parser.Term -> Node
|
|
simplifyTerm term = case term of
|
|
Parser.Mult factor term2 -> Operation Mult (simplifyFactor factor) (simplifyTerm term2)
|
|
Parser.Div factor term2 -> Operation Div (simplifyFactor factor) (simplifyTerm term2)
|
|
Parser.TFactor factor -> simplifyFactor factor
|
|
|
|
simplifyFactor :: Parser.Factor -> Node
|
|
simplifyFactor factor = case factor of
|
|
Parser.Integer i -> Scalar i
|
|
Parser.Parantheses expr -> simplifyExpr expr
|
|
Parser.NegFactor (Parser.Integer i) -> Scalar (-i) -- Shortcut to avoid storing -x as -1 * x
|
|
Parser.NegFactor factor2 -> Operation Mult (Scalar (-1)) (simplifyFactor factor2)
|