summaryrefslogtreecommitdiff
path: root/tiger-compiler/src/ast/op-exp.cc
blob: 6db49403acc13f08a4c851854eaf4e9a50d62f32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 ** \file ast/op-exp.cc
 ** \brief Implementation of ast::OpExp.
 */

#include <ast/op-exp.hh>
#include <ast/visitor.hh>

namespace ast
{
  OpExp::OpExp(const Location& location,
               Exp* left,
               OpExp::Oper oper,
               Exp* right)
    : Exp(location)
    , left_(left)
    , oper_(oper)
    , right_(right)
  {}

  OpExp::~OpExp()
  {
    delete left_;
    delete right_;
  }

  void OpExp::accept(ConstVisitor& v) const { v(*this); }

  void OpExp::accept(Visitor& v) { v(*this); }
} // namespace ast

std::string str(ast::OpExp::Oper oper)
{
  static const std::unordered_map<ast::OpExp::Oper, std::string> op_str = {
    {ast::OpExp::Oper::add, "+"}, {ast::OpExp::Oper::sub, "-"},
    {ast::OpExp::Oper::mul, "*"}, {ast::OpExp::Oper::div, "/"},
    {ast::OpExp::Oper::eq, "="},  {ast::OpExp::Oper::ne, "<>"},
    {ast::OpExp::Oper::lt, "<"},  {ast::OpExp::Oper::le, "<="},
    {ast::OpExp::Oper::gt, ">"},  {ast::OpExp::Oper::ge, ">="}};

  return op_str.at(oper);
}