comparison libinterp/parse-tree/lex.ll @ 16195:b52d2f9294b6

use class for reading lexer input * input.h, input.cc (octave_base_input_reader, octave_terminal_reader, octave_file_reader, octave_eval_string_reader): New classes. (octave_gets): Now a member function of octave_base_reader. (get_user_input): Delete function. Move actions to octave_terminal_reader::get_input and octave_eval_string_reader::get_input. function. Call from octave_file_reader::get_input. Don't check whether reading an eval string. (current_eval_string, get_input_from_eval_string): Delete global variables. (get_debug_input): Check CURR_LEXER->input_from_eval_string instead of global get_input_from_eval_string variable. Don't protect get_input_from_eval_string. * lex.h (octave_lexer::input_reader): New data member. (octave_lexer::octave_lexer (void)): Initialize it. (octave_lexer::octave_lexer (const std::string&), octave_lexer::octave_lexer (FILE *)): New constructors. * lex.h, lex.cc (octave_lexer::input_buffer::fill): New function. (octave_lexer::input_buffer::read): Delete. (octave_lexer::read): Rename from octave_read. Call reader to get input, and then hand it to the input_buffer instead of asking the input buffer to read input. Change all callers. (octave_lexer::input_source, octave_lexer::input_from_eval_string): New functions. Call octave_lexer::input_from_eval_string instead of using get_input_from_eval_string. * oct-parse.in.yy (octave_parser::octave_parser (FILE *), octave_parser::octave_parser (const std::string&)): New constructors. (parse_fcn_file): Pass FILE pointer to octave_parser constructor. (eval_string): Pass string to octave_parser constructor instead of setting global current_eval_string variable.
author John W. Eaton <jwe@octave.org>
date Tue, 05 Mar 2013 10:19:51 -0500
parents b7ca669af528
children 810a71122c25
comparison
equal deleted inserted replaced
16194:b7ca669af528 16195:b52d2f9294b6
116 116
117 #ifdef YY_INPUT 117 #ifdef YY_INPUT
118 #undef YY_INPUT 118 #undef YY_INPUT
119 #endif 119 #endif
120 #define YY_INPUT(buf, result, max_size) \ 120 #define YY_INPUT(buf, result, max_size) \
121 result = curr_lexer->octave_read (buf, max_size) 121 result = curr_lexer->read (buf, max_size)
122 122
123 // Try to avoid crashing out completely on fatal scanner errors. 123 // Try to avoid crashing out completely on fatal scanner errors.
124 124
125 #ifdef YY_FATAL_ERROR 125 #ifdef YY_FATAL_ERROR
126 #undef YY_FATAL_ERROR 126 #undef YY_FATAL_ERROR
1358 token_stack.pop (); 1358 token_stack.pop ();
1359 } 1359 }
1360 } 1360 }
1361 1361
1362 void 1362 void
1363 octave_lexer::input_buffer::read (void) 1363 octave_lexer::input_buffer::fill (const std::string& input, bool eof_arg)
1364 { 1364 {
1365 buffer = get_user_input (eof); 1365 buffer = input;
1366 chars_left = buffer.length (); 1366 chars_left = buffer.length ();
1367 pos = buffer.c_str (); 1367 pos = buffer.c_str ();
1368 eof = eof_arg;
1368 } 1369 }
1369 1370
1370 int 1371 int
1371 octave_lexer::input_buffer::copy_chunk (char *buf, size_t max_size) 1372 octave_lexer::input_buffer::copy_chunk (char *buf, size_t max_size)
1372 { 1373 {
1391 } 1392 }
1392 else 1393 else
1393 { 1394 {
1394 // There isn't enough room to plug the newline character 1395 // There isn't enough room to plug the newline character
1395 // in the buffer so arrange to have it returned on the next 1396 // in the buffer so arrange to have it returned on the next
1396 // call to octave_read. 1397 // call to octave_lexer::read.
1397 pos = eol; 1398 pos = eol;
1398 chars_left = 1; 1399 chars_left = 1;
1399 } 1400 }
1400 } 1401 }
1401 1402
1445 if (! quitting_gracefully 1446 if (! quitting_gracefully
1446 && (interactive || forced_interactive) 1447 && (interactive || forced_interactive)
1447 && ! (reading_fcn_file 1448 && ! (reading_fcn_file
1448 || reading_classdef_file 1449 || reading_classdef_file
1449 || reading_script_file 1450 || reading_script_file
1450 || get_input_from_eval_string 1451 || input_from_eval_string ()
1451 || input_from_startup_file)) 1452 || input_from_startup_file))
1452 yyrestart (stdin, scanner); 1453 yyrestart (stdin, scanner);
1453 1454
1454 // Clear the buffer for help text. 1455 // Clear the buffer for help text.
1455 while (! help_buf.empty ()) 1456 while (! help_buf.empty ())
1473 1474
1474 BEGIN (FUNCTION_FILE_BEGIN); 1475 BEGIN (FUNCTION_FILE_BEGIN);
1475 } 1476 }
1476 1477
1477 int 1478 int
1478 octave_lexer::octave_read (char *buf, unsigned max_size) 1479 octave_lexer::read (char *buf, unsigned max_size)
1479 { 1480 {
1480 int status = 0; 1481 int status = 0;
1481 1482
1482 if (input_buf.empty ()) 1483 if (input_buf.empty ())
1483 input_buf.read (); 1484 {
1485 bool eof = false;
1486 std::string input = input_reader.get_input (eof);
1487 input_buf.fill (input, eof);
1488 }
1484 1489
1485 if (! input_buf.empty ()) 1490 if (! input_buf.empty ())
1486 status = input_buf.copy_chunk (buf, max_size); 1491 status = input_buf.copy_chunk (buf, max_size);
1487 else 1492 else
1488 { 1493 {
1489 status = YY_NULL; 1494 status = YY_NULL;
1490 1495
1491 if (! input_buf.at_eof ()) 1496 if (! input_buf.at_eof ())
1492 fatal_error ("octave_read () in flex scanner failed"); 1497 fatal_error ("octave_lexer::read () in flex scanner failed");
1493 } 1498 }
1494 1499
1495 return status; 1500 return status;
1496 } 1501 }
1497 1502