view interpreter.h @ 12:894be158b32d

define parser as a class and eliminate some global variables
author John W. Eaton <jwe@octave.org>
date Thu, 23 May 2019 17:57:20 -0400
parents 04867eba6428
children 1e5a1e15fa56
line wrap: on
line source

#if ! defined (calc_interpreter_h)
#define calc_interpreter_h 1

#include <functional>

#include "parser.h"

namespace calc
{
  class interpreter
  {
  public:

    static interpreter *the_interpreter;

    interpreter (void);

    interpreter (const interpreter&) = delete;

    interpreter& operator = (const interpreter&) = delete;

    ~interpreter (void) = default;

    parser& get_parser (void) { return m_parser; }

    int parse_and_execute (const std::string& line);

    std::function<void (const char *)>
    set_error_handler (const std::function<void (const char *)>& error_handler)
    {
      std::function<void (const char *)> tmp = m_error_handler;
      m_error_handler = error_handler;
      return tmp;
    }

    std::function<void (double)>
    set_result_handler (const std::function<void (double)>& result_handler)
    {
      std::function<void (double)> tmp = m_result_handler;
      m_result_handler = result_handler;
      return tmp;
    }

    void emit_error (const char *msg) const;

    void emit_result (double value) const;

  private:

    parser m_parser;

    std::function<void (const char *)> m_error_handler;
    std::function<void (double)> m_result_handler;
  };
}

#endif