simple-arithmetic-compiler/app/AbstractSyntaxTree.hs

36 lines
1.1 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 factor2 -> Operation Mult (Scalar (-1)) (simplifyFactor factor2)