changeset 6:1b575145197e

interpreter is now a class instead of a namespace with functions
author John W. Eaton <jwe@octave.org>
date Thu, 23 May 2019 07:41:18 -0400
parents 54edd85237ab
children 04867eba6428
files interpreter.cpp interpreter.h parser.yy qt-interpreter.cpp qt-interpreter.h tty-main.cpp
diffstat 6 files changed, 64 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- 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 <iostream>
 #include <string>
 
 #include <unistd.h>
@@ -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);
--- 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
--- 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
--- 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 ());
   }
 }
--- 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 <QObject>
 #include <QString>
 
+#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;
   };
 }
 
--- 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;
   }