• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2014 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #include "compiler.hpp"
8 #include "vm.hpp"
9 
10 namespace client
11 {
operator ()(ast::nil) const12     void compiler::operator()(ast::nil) const
13     {
14         BOOST_ASSERT(0);
15     }
16 
operator ()(unsigned int n) const17     void compiler::operator()(unsigned int n) const
18     {
19         code.push_back(op_int);
20         code.push_back(n);
21     }
22 
operator ()(ast::operation const & x) const23     void compiler::operator()(ast::operation const& x) const
24     {
25         boost::apply_visitor(*this, x.operand_);
26         switch (x.operator_)
27         {
28             case '+': code.push_back(op_add); break;
29             case '-': code.push_back(op_sub); break;
30             case '*': code.push_back(op_mul); break;
31             case '/': code.push_back(op_div); break;
32             default: BOOST_ASSERT(0); break;
33         }
34     }
35 
operator ()(ast::signed_ const & x) const36     void compiler::operator()(ast::signed_ const& x) const
37     {
38         boost::apply_visitor(*this, x.operand_);
39         switch (x.sign)
40         {
41             case '-': code.push_back(op_neg); break;
42             case '+': break;
43             default: BOOST_ASSERT(0); break;
44         }
45     }
46 
operator ()(ast::expression const & x) const47     void compiler::operator()(ast::expression const& x) const
48     {
49         boost::apply_visitor(*this, x.first);
50         for (ast::operation const& oper : x.rest)
51         {
52             (*this)(oper);
53         }
54     }
55 }
56