comparison libinterp/parse-tree/oct-parse.yy @ 16167:22bb3aa9f025

make push parser interface partially work * oct-parse.yy: Use USE_OCTAVE_PUSH_PARSER, not USE_PUSH_PARSER. (octave_parser::~octave_parser): Cast parser state to yypstate*. (octave_parser::run): Simplify. If USE_OCTAVE_PUSH_PARSER, use push parser interface, but still require that the lexer is in charge of gathering input.
author John W. Eaton <jwe@octave.org>
date Fri, 01 Mar 2013 07:18:18 -0500
parents c5bfdc4c0963
children
comparison
equal deleted inserted replaced
16166:cb80b1d062b1 16167:22bb3aa9f025
1480 curr_parser->bison_error (s); 1480 curr_parser->bison_error (s);
1481 } 1481 }
1482 1482
1483 octave_parser::~octave_parser (void) 1483 octave_parser::~octave_parser (void)
1484 { 1484 {
1485 #if defined (USE_PUSH_PARSER) 1485 #if defined (OCTAVE_USE_PUSH_PARSER)
1486 yypstate_delete (parser_state); 1486 yypstate_delete (static_cast<yypstate *> (parser_state));
1487 #endif 1487 #endif
1488 1488
1489 delete curr_lexer; 1489 delete curr_lexer;
1490 } 1490 }
1491 void octave_parser::init (void) 1491 void octave_parser::init (void)
1492 { 1492 {
1493 #if defined (USE_PUSH_PARSER) 1493 #if defined (OCTAVE_USE_PUSH_PARSER)
1494 parser_state = yypstate_new (); 1494 parser_state = yypstate_new ();
1495 #endif 1495 #endif
1496 1496
1497 CURR_LEXER = curr_lexer; 1497 CURR_LEXER = curr_lexer;
1498 } 1498 }
1500 int 1500 int
1501 octave_parser::run (void) 1501 octave_parser::run (void)
1502 { 1502 {
1503 int status = 0; 1503 int status = 0;
1504 1504
1505 #if defined (USE_PUSH_PARSER) 1505 #if defined (OCTAVE_USE_PUSH_PARSER)
1506 1506
1507 for (;;) 1507 do
1508 { 1508 {
1509 unwind_protect frame; 1509 YYSTYPE lval;
1510 1510
1511 frame.protect_var (current_input_line); 1511 int token = octave_lex (&lval, scanner);
1512 1512
1513 bool eof = false; 1513 yypstate *pstate = static_cast<yypstate *> (parser_state);
1514 1514
1515 get_user_input (eof); 1515 status = octave_push_parse (pstate, token, &lval, this);
1516 1516 }
1517 do 1517 while (status == YYPUSH_MORE);
1518 {
1519 octave_char = eof ? END_OF_INPUT : octave_lex ();
1520
1521 if (octave_char == 0)
1522 {
1523 // Attempt to get more input.
1524 status = -1;
1525 break;
1526 }
1527
1528 status = octave_push_parse (pstate);
1529 }
1530 while (status == YYPUSH_MORE);
1531
1532 if (status >= 0)
1533 break;
1534 }
1535 1518
1536 #else 1519 #else
1537 1520
1538 status = octave_parse (this); 1521 status = octave_parse (this);
1539 1522