# HG changeset patch # User John W. Eaton # Date 1558611678 14400 # Node ID 1b575145197e7116977158d0e6f2355c1dd63956 # Parent 54edd85237abb215453ce97c36970b33a71ab6de interpreter is now a class instead of a namespace with functions diff -r 54edd85237ab -r 1b575145197e interpreter.cpp --- a/interpreter.cpp Wed May 22 18:07:37 2019 -0400 +++ b/interpreter.cpp Thu May 23 07:41:18 2019 -0400 @@ -1,3 +1,4 @@ +#include #include #include @@ -9,24 +10,34 @@ #include "gui-main.h" #include "tty-main.h" -namespace interpreter +namespace calc { - void init (void) + interpreter *interpreter::the_interpreter = nullptr; + + interpreter::interpreter (void) { + if (the_interpreter) + { + std::cerr << "multiple interpreters are not possible!" << std::endl; + exit (1); + } + + the_interpreter = this; + parser::init (); } - void fini (void) + interpreter::~interpreter (void) { parser::fini (); } - int parse_and_execute (const std::string& line) + int interpreter::parse_and_execute (const std::string& line) { return parser::parse_and_execute (line); } - void emit_result (double value) + void interpreter::emit_result (double value) { // Simulate a delay in calculation. sleep (1); @@ -37,7 +48,7 @@ gui::emit_result (value); } - void emit_error (const char *msg) + void interpreter::emit_error (const char *msg) { if (calc::tty_mode) tty::emit_error (msg); diff -r 54edd85237ab -r 1b575145197e interpreter.h --- a/interpreter.h Wed May 22 18:07:37 2019 -0400 +++ b/interpreter.h Thu May 23 07:41:18 2019 -0400 @@ -1,16 +1,30 @@ #if ! defined (calc_interpreter_h) #define calc_interpreter_h 1 -namespace interpreter +namespace calc { - extern void init (void); - extern void fini (void); + class interpreter + { + public: + + static interpreter *the_interpreter; + + interpreter (void); + + interpreter (const interpreter&) = delete; - extern int parse_and_execute (const std::string& line); + interpreter& operator = (const interpreter&) = delete; + + ~interpreter (void); + + int parse_and_execute (const std::string& line); - extern void emit_error (const char *msg); + void emit_error (const char *msg); - extern void emit_result (double value); + void emit_result (double value); + + private: + }; } #endif diff -r 54edd85237ab -r 1b575145197e parser.yy --- a/parser.yy Wed May 22 18:07:37 2019 -0400 +++ b/parser.yy Thu May 23 07:41:18 2019 -0400 @@ -33,6 +33,9 @@ static void yyerror (char const *); +static void emit_error (const char *msg); +static void emit_result (double value); + %} %define api.push-pull push @@ -60,7 +63,7 @@ { } | exp ';' { - interpreter::emit_result ($1); + emit_result ($1); parser::beg_of_stmt = true; } ; @@ -197,5 +200,15 @@ static void yyerror (char const *msg) { - interpreter::emit_error (msg); + emit_error (msg); } + +static void emit_error (const char *msg) +{ + calc::interpreter::the_interpreter->emit_error (msg); +} + +static void emit_result (double value) +{ + calc::interpreter::the_interpreter->emit_result (value); +} \ No newline at end of file diff -r 54edd85237ab -r 1b575145197e qt-interpreter.cpp --- a/qt-interpreter.cpp Wed May 22 18:07:37 2019 -0400 +++ b/qt-interpreter.cpp Thu May 23 07:41:18 2019 -0400 @@ -12,14 +12,8 @@ namespace calc { qt_interpreter::qt_interpreter (void) - { - interpreter::init (); - } - - qt_interpreter::~qt_interpreter (void) - { - interpreter::fini (); - } + : m_interpreter () + { } void qt_interpreter::execute (void) { @@ -27,6 +21,6 @@ void qt_interpreter::accept_input_line (const QString& line) { - interpreter::parse_and_execute (line.toStdString ()); + m_interpreter.parse_and_execute (line.toStdString ()); } } diff -r 54edd85237ab -r 1b575145197e qt-interpreter.h --- a/qt-interpreter.h Wed May 22 18:07:37 2019 -0400 +++ b/qt-interpreter.h Thu May 23 07:41:18 2019 -0400 @@ -4,6 +4,8 @@ #include #include +#include "interpreter.h" + namespace calc { class qt_interpreter : public QObject @@ -14,7 +16,7 @@ qt_interpreter (void); - ~qt_interpreter (void); + ~qt_interpreter (void) = default; qt_interpreter (const qt_interpreter&) = delete; @@ -25,6 +27,10 @@ void execute (void); void accept_input_line (const QString& line); + + private: + + interpreter m_interpreter; }; } diff -r 54edd85237ab -r 1b575145197e tty-main.cpp --- a/tty-main.cpp Wed May 22 18:07:37 2019 -0400 +++ b/tty-main.cpp Thu May 23 07:41:18 2019 -0400 @@ -23,7 +23,7 @@ << "Semicolon terminates statement.\n" << "GNU Readline available for history editing.\n" << std::endl; - interpreter::init (); + calc::interpreter interp; for (;;) { @@ -42,14 +42,12 @@ free (tmp); - int status = interpreter::parse_and_execute (line); + int status = interp.parse_and_execute (line); if (status < 0) break; } - interpreter::fini (); - return 0; }