Mercurial > octave-nkf
view libinterp/corefcn/oct-tex-lexer.in.ll @ 20574:dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
* lo-array-gripes.h, lo-array-gripes.cc (index_exception):
New base class for indexing errors.
(invalid_index, out_of_range): New classes.
(gripe_index_out_of_range): New overloaded function.
(gripe_invalid_index): New overloaded functions.
Delete version with no arguments.
(gripe_invalid_assignment_size, gripe_assignment_dimension_mismatch):
Delete.
Change uses of gripe functions as needed.
* Cell.cc (Cell::index, Cell::assign, Cell::delete_elements): Use
exceptions to collect error info about and handle indexing errors.
* data.cc (Fnth_element, do_accumarray_sum, F__accumarray_sum__,
do_accumarray_minmax, do_accumarray_minmax_fun, F__accumdim_sum__):
Likewise.
* oct-map.cc (octave_map::index, octave_map::assign,
octave_map::delete_elements): Likewise.
* sparse.cc (Fsparse): Likewise.
* sub2ind.cc (Fsub2ind, Find2sub): Likewise. New tests.
* utils.cc (dims_to_numel): Likewise.
* ov-base-diag.cc (octave_base_diag<DMT, MT>::do_index_op,
octave_base_diag<DMT, MT>::subsasgn): Likewise.
* ov-base-mat.cc (octave_base_matrix<MT>::subsref,
octave_base_matrix<MT>::assign): Likewise.
* ov-base-sparse.cc (octave_base_sparse<T>::do_index_op,
octave_base_sparse<T>::assign,
octave_base_sparse<MT>::delete_elements): Likewise.
* ov-classdef.cc (cdef_object_array::subsref,
cdef_object_array::subsasgn): Likewise.
* ov-java.cc (make_java_index): Likewise.
* ov-perm.cc (octave_perm_matrix::do_index_op): Likewise.
* ov-range.cc (octave_range::do_index_op): Likewise.
* ov-re-diag.cc (octave_diag_matrix::do_index_op): Likewise.
* ov-str-mat.cc (octave_char_matrix_str::do_index_op_internal): Likewise.
* pt-assign.cc (tree_simple_assignment::rvalue1): Likewise.
* pt-idx.cc (tree_index_expression::rvalue,
tree_index_expression::lvalue): Likewise.
* Array-util.cc (sub2ind): Likewise.
* toplev.cc (main_loop): Also catch unhandled index_exception
exceptions.
* ov-base.cc (octave_base_value::index_vector): Improve error message.
* ov-re-sparse.cc (octave_sparse_matrix::index_vector): Likewise.
* ov-complex.cc (complex_index): New class.
(gripe_complex_index): New function.
(octave_complex::index_vector): Use it.
* pt-id.h, pt-id.cc (tree_identifier::is_variable,
tree_black_hole::is_variable): Now const.
* pt-idx.cc (final_index_error): New static function.
(tree_index_expression::rvalue, tree_index_expression::lvalue):
Use it.
* index.tst: New tests.
author | Lachlan Andrew <lachlanbis@gmail.com> |
---|---|
date | Fri, 02 Oct 2015 15:07:37 -0400 |
parents | e3c0fee87493 |
children |
line wrap: on
line source
/* Copyright (C) 2013-2015 Michael Goffioul This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ %option prefix = "octave_tex_" %option noyywrap %option reentrant %option bison-bridge %option noyyalloc %option noyyrealloc %option noyyfree %top { #ifdef HAVE_CONFIG_H #include <config.h> #endif } %x NUM_MODE %x MAYBE_NUM_MODE %{ // The generated code may include unistd.h. We need that to happen // before defining isatty to be prefixed with the gnulib namespace // identifier. #include <sys/types.h> #include <unistd.h> #include "txt-eng.h" #include "oct-tex-parser.h" // FIXME: with bison 3.x, OCTAVE_TEX_STYPE appears in the generated // oct-parse.h file, but there is no definition for YYSTYPE, which is // needed by the code that is generated by flex. I can't seem to find // a way to tell flex to use OCTAVE_TEX_STYPE instead of YYSTYPE in // the code it generates, or to tell bison to provide the definition // of YYSTYPE in the generated oct-parse.h file. #if defined (OCTAVE_TEX_STYPE_IS_DECLARED) && ! defined YYSTYPE #define YYSTYPE OCTAVE_TEX_STYPE #endif #if defined (GNULIB_NAMESPACE) // Calls to the following functions appear in the generated output // from flex without the namespace tag. Redefine them so we will use // them via the gnulib namespace. #define fprintf GNULIB_NAMESPACE::fprintf #define fread GNULIB_NAMESPACE::fread #define fwrite GNULIB_NAMESPACE::fwrite #define getc GNULIB_NAMESPACE::getc #define isatty GNULIB_NAMESPACE::isatty #define malloc GNULIB_NAMESPACE::malloc #define realloc GNULIB_NAMESPACE::realloc #endif %} D [0-9] NUM (({D}+\.?{D}*)|(\.{D}+)) %% %{ // Numeric values. %} <NUM_MODE>{NUM} { int nread = sscanf (yytext, "%lf", &(yylval->num)); if (nread == 1) return NUM; } <NUM_MODE>[ \t]+ { } <NUM_MODE>"\n"|. { yyless (0); BEGIN (INITIAL); } <MAYBE_NUM_MODE>"{" { BEGIN (NUM_MODE); return START; } <MAYBE_NUM_MODE>"\n"|. { yyless (0); BEGIN (INITIAL); } %{ // Simple commands. %} "\\bf" { return BF; } "\\it" { return IT; } "\\sl" { return SL; } "\\rm" { return RM; } %{ // Generic font commands. %} "\\fontname" { return FONTNAME; } "\\fontsize" { BEGIN (MAYBE_NUM_MODE); return FONTSIZE; } "\\color[rgb]" { BEGIN (MAYBE_NUM_MODE); return COLOR_RGB; } "\\color" { return COLOR; } %{ // Special characters. %} "{" { return START; } "}" { return END; } "^" { return SUPER; } "_" { return SUB; } "\\{" | "\\}" | "\\^" | "\\_" | "\\\\" { yylval->ch = yytext[1]; return CH; } %{ // Symbols. %} @SYMBOL_RULES@ %{ // Generic character. %} "\n" | . { yylval->ch = yytext[0]; return CH; } %% void * octave_tex_alloc (yy_size_t size, yyscan_t) { return malloc (size); } void * octave_tex_realloc (void *ptr, yy_size_t size, yyscan_t) { return realloc (ptr, size); } void octave_tex_free (void *ptr, yyscan_t) { free (ptr); } bool text_parser_tex::init_lexer (const std::string& s) { if (! scanner) octave_tex_lex_init (&scanner); if (scanner) { if (buffer_state) { octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state), scanner); buffer_state = 0; } buffer_state = octave_tex__scan_bytes (s.data (), s.length (), scanner); } return (scanner && buffer_state); } void text_parser_tex::destroy_lexer (void) { if (buffer_state) { octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state), scanner); buffer_state = 0; } if (scanner) { octave_tex_lex_destroy (scanner); scanner = 0; } }