2018-07-26 19:47:56 -07:00
|
|
|
require "./tree.cr"
|
|
|
|
|
|
|
|
module Chalk
|
2018-08-01 22:40:41 -07:00
|
|
|
module Trees
|
2018-08-02 01:09:48 -07:00
|
|
|
# `Trees::Transformer` that turns operations on
|
|
|
|
# Constants into constants.
|
2018-08-01 22:40:41 -07:00
|
|
|
class ConstantFolder < Transformer
|
|
|
|
private def perform_op(op, left, right)
|
|
|
|
case op
|
|
|
|
when Compiler::TokenType::OpAdd
|
|
|
|
left + right
|
|
|
|
when Compiler::TokenType::OpSub
|
|
|
|
left - right
|
|
|
|
when Compiler::TokenType::OpMul
|
|
|
|
left*right
|
|
|
|
when Compiler::TokenType::OpDiv
|
|
|
|
left/right
|
|
|
|
when Compiler::TokenType::OpAnd
|
|
|
|
left & right
|
|
|
|
when Compiler::TokenType::OpOr
|
|
|
|
left | right
|
|
|
|
else Compiler::TokenType::OpXor
|
|
|
|
left ^ right
|
|
|
|
end
|
2018-07-26 19:47:56 -07:00
|
|
|
end
|
|
|
|
|
2018-08-01 22:40:41 -07:00
|
|
|
def transform(tree : Trees::TreeOp)
|
|
|
|
if tree.left.is_a?(Trees::TreeLit) && tree.right.is_a?(Trees::TreeLit)
|
|
|
|
return Trees::TreeLit.new perform_op(tree.op,
|
|
|
|
tree.left.as(Trees::TreeLit).lit,
|
|
|
|
tree.right.as(Trees::TreeLit).lit)
|
|
|
|
end
|
|
|
|
return tree
|
2018-07-26 19:47:56 -07:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|