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)