diff libinterp/parse-tree/oct-parse.yy @ 16157:335041cc657a

optionally use push parser interface * configure.ac (USE_PUSH_PARSER): New config variable. Display setting in config summary. Provide --enable-push-parser option. * oct-parse.yy: Use "%define api.push-pull both" bison option. * parse.h, oct-parse.yy (octave_parser::parser_state): New member variable. (octave_parser::init): Initialize it if USE_PUSH_PARSER is defined. (octave_parser::~octave_parser): Delete it if USE_PUSH_PARSER. (octave_parser::run): Use push parser interface if USE_PUSH_PARSER.
author John W. Eaton <jwe@octave.org>
date Thu, 28 Feb 2013 10:53:27 -0500
parents a57c2c8c8163
children 7eb614760ddb
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy	Thu Feb 28 02:25:44 2013 -0500
+++ b/libinterp/parse-tree/oct-parse.yy	Thu Feb 28 10:53:27 2013 -0500
@@ -166,6 +166,7 @@
 // object) relevant global values before and after the nested call.
 
 %define api.pure
+%define api.push-pull both
 %parse-param { octave_parser *curr_parser }
 %lex-param { void *scanner }
 
@@ -1479,10 +1480,66 @@
   curr_parser->bison_error (s);
 }
 
+octave_parser::~octave_parser (void)
+{
+#if defined (USE_PUSH_PARSER)
+  yypstate_delete (parser_state);
+#endif
+
+delete curr_lexer;
+}
+void octave_parser::init (void)
+{
+#if defined (USE_PUSH_PARSER)
+  parser_state = yypstate_new ();
+#endif
+
+  CURR_LEXER = curr_lexer;
+}
+
 int
 octave_parser::run (void)
 {
-  return octave_parse (this);
+  int status = 0;
+
+#if defined (USE_PUSH_PARSER)
+
+  for (;;)
+    {
+      unwind_protect frame;
+
+      frame.protect_var (current_input_line);
+
+      bool eof = false;
+
+      get_user_input (eof);
+
+      do
+        {
+          octave_char = eof ? END_OF_INPUT : octave_lex ();
+
+          if (octave_char == 0)
+            {
+              // Attempt to get more input.
+              status = -1;
+              break;
+            }
+
+          status = octave_push_parse (pstate);
+        }
+      while (status == YYPUSH_MORE);
+
+      if (status >= 0)
+        break;
+    }
+
+#else
+
+  status = octave_parse (this);
+
+#endif
+
+  return status;
 }
 
 // Error mesages for mismatched end tokens.