Mercurial > hg > octave-nkf
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 |