Mercurial > octave-antonio
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.