Mercurial > octave-nkf
view libinterp/parse-tree/lex.h @ 17787:175b392e91fe
Use GNU style coding conventions for code in libinterp/
* libinterp/corefcn/Cell.h, libinterp/corefcn/__contourc__.cc,
libinterp/corefcn/__dispatch__.cc, libinterp/corefcn/__lin_interpn__.cc,
libinterp/corefcn/__pchip_deriv__.cc, libinterp/corefcn/__qp__.cc,
libinterp/corefcn/balance.cc, libinterp/corefcn/besselj.cc,
libinterp/corefcn/betainc.cc, libinterp/corefcn/bitfcns.cc,
libinterp/corefcn/bsxfun.cc, libinterp/corefcn/c-file-ptr-stream.cc,
libinterp/corefcn/c-file-ptr-stream.h, libinterp/corefcn/cellfun.cc,
libinterp/corefcn/colloc.cc, libinterp/corefcn/comment-list.h,
libinterp/corefcn/conv2.cc, libinterp/corefcn/daspk.cc,
libinterp/corefcn/dasrt.cc, libinterp/corefcn/dassl.cc,
libinterp/corefcn/data.cc, libinterp/corefcn/debug.cc,
libinterp/corefcn/defaults.cc, libinterp/corefcn/defaults.in.h,
libinterp/corefcn/defun-int.h, libinterp/corefcn/defun.cc,
libinterp/corefcn/det.cc, libinterp/corefcn/dirfns.cc,
libinterp/corefcn/display.cc, libinterp/corefcn/dlmread.cc,
libinterp/corefcn/dot.cc, libinterp/corefcn/dynamic-ld.cc,
libinterp/corefcn/dynamic-ld.h, libinterp/corefcn/eig.cc,
libinterp/corefcn/ellipj.cc, libinterp/corefcn/error.cc,
libinterp/corefcn/error.h, libinterp/corefcn/event-queue.h,
libinterp/corefcn/fft.cc, libinterp/corefcn/fft2.cc, libinterp/corefcn/fftn.cc,
libinterp/corefcn/file-io.cc, libinterp/corefcn/filter.cc,
libinterp/corefcn/find.cc, libinterp/corefcn/gammainc.cc,
libinterp/corefcn/gcd.cc, libinterp/corefcn/getgrent.cc,
libinterp/corefcn/getpwent.cc, libinterp/corefcn/getrusage.cc,
libinterp/corefcn/givens.cc, libinterp/corefcn/gl-render.cc,
libinterp/corefcn/gl2ps-renderer.cc, libinterp/corefcn/gl2ps-renderer.h,
libinterp/corefcn/graphics.cc, libinterp/corefcn/graphics.in.h,
libinterp/corefcn/gripes.cc, libinterp/corefcn/gripes.h,
libinterp/corefcn/help.cc, libinterp/corefcn/hess.cc,
libinterp/corefcn/hex2num.cc, libinterp/corefcn/input.cc,
libinterp/corefcn/input.h, libinterp/corefcn/inv.cc,
libinterp/corefcn/jit-ir.h, libinterp/corefcn/jit-typeinfo.cc,
libinterp/corefcn/jit-typeinfo.h, libinterp/corefcn/jit-util.h,
libinterp/corefcn/kron.cc, libinterp/corefcn/load-path.cc,
libinterp/corefcn/load-path.h, libinterp/corefcn/load-save.cc,
libinterp/corefcn/load-save.h, libinterp/corefcn/lookup.cc,
libinterp/corefcn/ls-ascii-helper.cc, libinterp/corefcn/ls-hdf5.cc,
libinterp/corefcn/ls-hdf5.h, libinterp/corefcn/ls-mat-ascii.cc,
libinterp/corefcn/ls-mat-ascii.h, libinterp/corefcn/ls-mat4.cc,
libinterp/corefcn/ls-mat5.cc, libinterp/corefcn/ls-mat5.h,
libinterp/corefcn/ls-oct-ascii.cc, libinterp/corefcn/lsode.cc,
libinterp/corefcn/lu.cc, libinterp/corefcn/luinc.cc,
libinterp/corefcn/mappers.cc, libinterp/corefcn/matrix_type.cc,
libinterp/corefcn/max.cc, libinterp/corefcn/md5sum.cc,
libinterp/corefcn/mex.cc, libinterp/corefcn/mexproto.h,
libinterp/corefcn/mgorth.cc, libinterp/corefcn/mxarray.in.h,
libinterp/corefcn/nproc.cc, libinterp/corefcn/oct-hist.cc,
libinterp/corefcn/oct-lvalue.h, libinterp/corefcn/oct-map.cc,
libinterp/corefcn/oct-map.h, libinterp/corefcn/oct-obj.h,
libinterp/corefcn/oct-prcstrm.h, libinterp/corefcn/oct-stdstrm.h,
libinterp/corefcn/oct-stream.cc, libinterp/corefcn/oct-stream.h,
libinterp/corefcn/octave-link.cc, libinterp/corefcn/octave-link.h,
libinterp/corefcn/pager.cc, libinterp/corefcn/pinv.cc,
libinterp/corefcn/pr-output.cc, libinterp/corefcn/procstream.h,
libinterp/corefcn/profiler.cc, libinterp/corefcn/pt-jit.cc,
libinterp/corefcn/pt-jit.h, libinterp/corefcn/quad.cc,
libinterp/corefcn/quadcc.cc, libinterp/corefcn/qz.cc,
libinterp/corefcn/rand.cc, libinterp/corefcn/rcond.cc,
libinterp/corefcn/regexp.cc, libinterp/corefcn/schur.cc,
libinterp/corefcn/sighandlers.cc, libinterp/corefcn/sighandlers.h,
libinterp/corefcn/sparse-xdiv.cc, libinterp/corefcn/sparse-xdiv.h,
libinterp/corefcn/sparse-xpow.cc, libinterp/corefcn/sparse.cc,
libinterp/corefcn/spparms.cc, libinterp/corefcn/sqrtm.cc,
libinterp/corefcn/str2double.cc, libinterp/corefcn/strfind.cc,
libinterp/corefcn/strfns.cc, libinterp/corefcn/sub2ind.cc,
libinterp/corefcn/svd.cc, libinterp/corefcn/syl.cc,
libinterp/corefcn/symtab.cc, libinterp/corefcn/symtab.h,
libinterp/corefcn/syscalls.cc, libinterp/corefcn/sysdep.cc,
libinterp/corefcn/sysdep.h, libinterp/corefcn/time.cc,
libinterp/corefcn/toplev.cc, libinterp/corefcn/toplev.h,
libinterp/corefcn/tril.cc, libinterp/corefcn/txt-eng-ft.cc,
libinterp/corefcn/txt-eng-ft.h, libinterp/corefcn/txt-eng.h,
libinterp/corefcn/typecast.cc, libinterp/corefcn/urlwrite.cc,
libinterp/corefcn/utils.cc, libinterp/corefcn/variables.cc,
libinterp/corefcn/variables.h, libinterp/corefcn/xdiv.cc,
libinterp/corefcn/xdiv.h, libinterp/corefcn/xnorm.h, libinterp/corefcn/xpow.cc,
libinterp/corefcn/xpow.h, libinterp/corefcn/zfstream.cc,
libinterp/corefcn/zfstream.h, libinterp/dldfcn/__delaunayn__.cc,
libinterp/dldfcn/__dsearchn__.cc, libinterp/dldfcn/__eigs__.cc,
libinterp/dldfcn/__fltk_uigetfile__.cc, libinterp/dldfcn/__glpk__.cc,
libinterp/dldfcn/__init_fltk__.cc, libinterp/dldfcn/__init_gnuplot__.cc,
libinterp/dldfcn/__magick_read__.cc, libinterp/dldfcn/__voronoi__.cc,
libinterp/dldfcn/amd.cc, libinterp/dldfcn/ccolamd.cc, libinterp/dldfcn/chol.cc,
libinterp/dldfcn/colamd.cc, libinterp/dldfcn/convhulln.cc,
libinterp/dldfcn/dmperm.cc, libinterp/dldfcn/fftw.cc, libinterp/dldfcn/qr.cc,
libinterp/dldfcn/symbfact.cc, libinterp/dldfcn/symrcm.cc,
libinterp/dldfcn/tsearch.cc, libinterp/octave-value/ov-base-diag.cc,
libinterp/octave-value/ov-base-diag.h, libinterp/octave-value/ov-base-int.cc,
libinterp/octave-value/ov-base-int.h, libinterp/octave-value/ov-base-mat.h,
libinterp/octave-value/ov-base-scalar.cc,
libinterp/octave-value/ov-base-scalar.h,
libinterp/octave-value/ov-base-sparse.cc,
libinterp/octave-value/ov-base-sparse.h, libinterp/octave-value/ov-base.cc,
libinterp/octave-value/ov-base.h, libinterp/octave-value/ov-bool-mat.cc,
libinterp/octave-value/ov-bool-mat.h, libinterp/octave-value/ov-bool-sparse.cc,
libinterp/octave-value/ov-bool-sparse.h, libinterp/octave-value/ov-bool.cc,
libinterp/octave-value/ov-bool.h, libinterp/octave-value/ov-builtin.cc,
libinterp/octave-value/ov-builtin.h, libinterp/octave-value/ov-cell.cc,
libinterp/octave-value/ov-cell.h, libinterp/octave-value/ov-ch-mat.cc,
libinterp/octave-value/ov-ch-mat.h, libinterp/octave-value/ov-class.cc,
libinterp/octave-value/ov-class.h, libinterp/octave-value/ov-colon.h,
libinterp/octave-value/ov-complex.cc, libinterp/octave-value/ov-complex.h,
libinterp/octave-value/ov-cx-diag.cc, libinterp/octave-value/ov-cx-diag.h,
libinterp/octave-value/ov-cx-mat.cc, libinterp/octave-value/ov-cx-mat.h,
libinterp/octave-value/ov-cx-sparse.cc, libinterp/octave-value/ov-cx-sparse.h,
libinterp/octave-value/ov-dld-fcn.h, libinterp/octave-value/ov-fcn-handle.cc,
libinterp/octave-value/ov-fcn-handle.h,
libinterp/octave-value/ov-fcn-inline.cc,
libinterp/octave-value/ov-fcn-inline.h, libinterp/octave-value/ov-fcn.h,
libinterp/octave-value/ov-float.cc, libinterp/octave-value/ov-float.h,
libinterp/octave-value/ov-flt-complex.cc,
libinterp/octave-value/ov-flt-complex.h,
libinterp/octave-value/ov-flt-cx-diag.cc,
libinterp/octave-value/ov-flt-cx-diag.h,
libinterp/octave-value/ov-flt-cx-mat.cc,
libinterp/octave-value/ov-flt-cx-mat.h,
libinterp/octave-value/ov-flt-re-diag.cc,
libinterp/octave-value/ov-flt-re-diag.h,
libinterp/octave-value/ov-flt-re-mat.cc,
libinterp/octave-value/ov-flt-re-mat.h, libinterp/octave-value/ov-int16.cc,
libinterp/octave-value/ov-int32.cc, libinterp/octave-value/ov-int64.cc,
libinterp/octave-value/ov-int8.cc, libinterp/octave-value/ov-intx.h,
libinterp/octave-value/ov-java.cc, libinterp/octave-value/ov-lazy-idx.h,
libinterp/octave-value/ov-mex-fcn.cc, libinterp/octave-value/ov-mex-fcn.h,
libinterp/octave-value/ov-null-mat.cc, libinterp/octave-value/ov-null-mat.h,
libinterp/octave-value/ov-oncleanup.cc, libinterp/octave-value/ov-perm.cc,
libinterp/octave-value/ov-perm.h, libinterp/octave-value/ov-range.cc,
libinterp/octave-value/ov-range.h, libinterp/octave-value/ov-re-diag.cc,
libinterp/octave-value/ov-re-diag.h, libinterp/octave-value/ov-re-mat.cc,
libinterp/octave-value/ov-re-mat.h, libinterp/octave-value/ov-re-sparse.cc,
libinterp/octave-value/ov-re-sparse.h, libinterp/octave-value/ov-scalar.cc,
libinterp/octave-value/ov-scalar.h, libinterp/octave-value/ov-str-mat.cc,
libinterp/octave-value/ov-str-mat.h, libinterp/octave-value/ov-struct.cc,
libinterp/octave-value/ov-struct.h, libinterp/octave-value/ov-type-conv.h,
libinterp/octave-value/ov-typeinfo.cc, libinterp/octave-value/ov-typeinfo.h,
libinterp/octave-value/ov-uint16.cc, libinterp/octave-value/ov-uint32.cc,
libinterp/octave-value/ov-uint64.cc, libinterp/octave-value/ov-uint8.cc,
libinterp/octave-value/ov-usr-fcn.cc, libinterp/octave-value/ov-usr-fcn.h,
libinterp/octave-value/ov.cc, libinterp/octave-value/ov.h, libinterp/octave.cc,
libinterp/operators/op-b-bm.cc, libinterp/operators/op-b-sbm.cc,
libinterp/operators/op-bm-b.cc, libinterp/operators/op-bm-bm.cc,
libinterp/operators/op-cdm-cdm.cc, libinterp/operators/op-chm.cc,
libinterp/operators/op-class.cc, libinterp/operators/op-cm-cm.cc,
libinterp/operators/op-cm-cs.cc, libinterp/operators/op-cm-s.cc,
libinterp/operators/op-cm-scm.cc, libinterp/operators/op-cm-sm.cc,
libinterp/operators/op-cs-cm.cc, libinterp/operators/op-cs-cs.cc,
libinterp/operators/op-cs-scm.cc, libinterp/operators/op-cs-sm.cc,
libinterp/operators/op-dm-dm.cc, libinterp/operators/op-dm-scm.cc,
libinterp/operators/op-double-conv.cc, libinterp/operators/op-fcdm-fcdm.cc,
libinterp/operators/op-fcm-fcm.cc, libinterp/operators/op-fcm-fcs.cc,
libinterp/operators/op-fcm-fm.cc, libinterp/operators/op-fcm-fs.cc,
libinterp/operators/op-fcs-fcm.cc, libinterp/operators/op-fcs-fcs.cc,
libinterp/operators/op-fcs-fm.cc, libinterp/operators/op-fcs-fs.cc,
libinterp/operators/op-fdm-fdm.cc, libinterp/operators/op-float-conv.cc,
libinterp/operators/op-fm-fcm.cc, libinterp/operators/op-fm-fcs.cc,
libinterp/operators/op-fm-fm.cc, libinterp/operators/op-fm-fs.cc,
libinterp/operators/op-fs-fcm.cc, libinterp/operators/op-fs-fcs.cc,
libinterp/operators/op-fs-fm.cc, libinterp/operators/op-fs-fs.cc,
libinterp/operators/op-m-cm.cc, libinterp/operators/op-m-cs.cc,
libinterp/operators/op-m-m.cc, libinterp/operators/op-m-s.cc,
libinterp/operators/op-m-scm.cc, libinterp/operators/op-m-sm.cc,
libinterp/operators/op-pm-scm.cc, libinterp/operators/op-range.cc,
libinterp/operators/op-s-cm.cc, libinterp/operators/op-s-cs.cc,
libinterp/operators/op-s-scm.cc, libinterp/operators/op-sbm-b.cc,
libinterp/operators/op-sbm-bm.cc, libinterp/operators/op-sbm-sbm.cc,
libinterp/operators/op-scm-cm.cc, libinterp/operators/op-scm-cs.cc,
libinterp/operators/op-scm-m.cc, libinterp/operators/op-scm-s.cc,
libinterp/operators/op-scm-scm.cc, libinterp/operators/op-scm-sm.cc,
libinterp/operators/op-sm-cm.cc, libinterp/operators/op-sm-m.cc,
libinterp/operators/op-sm-s.cc, libinterp/operators/op-sm-scm.cc,
libinterp/operators/op-sm-sm.cc, libinterp/operators/op-str-m.cc,
libinterp/operators/op-str-s.cc, libinterp/operators/op-str-str.cc,
libinterp/operators/ops.h, libinterp/parse-tree/lex.h,
libinterp/parse-tree/parse.h, libinterp/parse-tree/pt-arg-list.cc,
libinterp/parse-tree/pt-arg-list.h, libinterp/parse-tree/pt-assign.cc,
libinterp/parse-tree/pt-assign.h, libinterp/parse-tree/pt-binop.cc,
libinterp/parse-tree/pt-binop.h, libinterp/parse-tree/pt-bp.h,
libinterp/parse-tree/pt-cbinop.cc, libinterp/parse-tree/pt-check.cc,
libinterp/parse-tree/pt-colon.cc, libinterp/parse-tree/pt-colon.h,
libinterp/parse-tree/pt-const.cc, libinterp/parse-tree/pt-decl.cc,
libinterp/parse-tree/pt-decl.h, libinterp/parse-tree/pt-eval.cc,
libinterp/parse-tree/pt-except.h, libinterp/parse-tree/pt-exp.h,
libinterp/parse-tree/pt-fcn-handle.cc, libinterp/parse-tree/pt-id.cc,
libinterp/parse-tree/pt-id.h, libinterp/parse-tree/pt-idx.cc,
libinterp/parse-tree/pt-idx.h, libinterp/parse-tree/pt-loop.h,
libinterp/parse-tree/pt-mat.cc, libinterp/parse-tree/pt-misc.cc,
libinterp/parse-tree/pt-misc.h, libinterp/parse-tree/pt-pr-code.cc,
libinterp/parse-tree/pt-select.h, libinterp/parse-tree/pt-stmt.h,
libinterp/parse-tree/token.h, libinterp/version.cc:
Use GNU style coding conventions for code in libinterp/
author | Rik <rik@octave.org> |
---|---|
date | Mon, 28 Oct 2013 19:51:46 -0700 |
parents | d63878346099 |
children | 6b51f5f44aea |
line wrap: on
line source
/* Copyright (C) 1993-2013 John W. Eaton 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/>. */ #if !defined (octave_lex_h) #define octave_lex_h 1 #include <deque> #include <limits> #include <list> #include <set> #include <stack> #include "comment-list.h" #include "input.h" #include "token.h" // Is the given string a keyword? extern bool is_keyword (const std::string& s); // For communication between the lexer and parser. class lexical_feedback { public: // Track symbol table information when parsing functions. class symbol_table_context { public: symbol_table_context (void) : frame_stack (), init_scope (symbol_table::current_scope ()) { push (init_scope); } void clear (void) { while (! frame_stack.empty ()) frame_stack.pop (); push (init_scope); } bool empty (void) const { return frame_stack.empty (); } void pop (void) { frame_stack.pop (); } void push (symbol_table::scope_id scope) { frame_stack.push (scope); } void push (void) { push (symbol_table::current_scope ()); } symbol_table::scope_id curr_scope (void) const { return frame_stack.top (); } private: std::stack<symbol_table::scope_id> frame_stack; symbol_table::scope_id init_scope; }; // Track nesting of square brackets, curly braces, and parentheses. class bbp_nesting_level { private: enum bracket_type { BRACKET = 1, BRACE = 2, PAREN = 3, ANON_FCN_BODY = 4 }; public: bbp_nesting_level (void) : context () { } bbp_nesting_level (const bbp_nesting_level& nl) : context (nl.context) { } bbp_nesting_level& operator = (const bbp_nesting_level& nl) { if (&nl != this) context = nl.context; return *this; } ~bbp_nesting_level (void) { } void reset (void) { while (! context.empty ()) context.pop (); } void bracket (void) { context.push (BRACKET); } bool is_bracket (void) { return ! context.empty () && context.top () == BRACKET; } void brace (void) { context.push (BRACE); } bool is_brace (void) { return ! context.empty () && context.top () == BRACE; } void paren (void) { context.push (PAREN); } bool is_paren (void) { return ! context.empty () && context.top () == PAREN; } void anon_fcn_body (void) { context.push (ANON_FCN_BODY); } bool is_anon_fcn_body (void) { return ! context.empty () && context.top () == ANON_FCN_BODY; } bool is_bracket_or_brace (void) { return (! context.empty () && (context.top () == BRACKET || context.top () == BRACE)); } bool none (void) { return context.empty (); } void remove (void) { if (! context.empty ()) context.pop (); } void clear (void) { while (! context.empty ()) context.pop (); } private: std::stack<int> context; }; class token_cache { public: // Store an "unlimited" number of tokens. token_cache (size_t sz_arg = std::numeric_limits<size_t>::max ()) : buffer (), sz (sz_arg) { } void push (token *tok) { if (buffer.size () == sz) pop (); buffer.push_front (tok); } void pop (void) { if (! empty ()) { delete buffer.back (); buffer.pop_back (); } } // Direct access. token *at (size_t n) { return empty () ? 0 : buffer.at (n); } const token *at (size_t n) const { return empty () ? 0 : buffer.at (n); } // Most recently pushed. token *front (void) { return empty () ? 0 : buffer.front (); } const token *front (void) const { return empty () ? 0 : buffer.front (); } token *back (void) { return empty () ? 0 : buffer.back (); } const token *back (void) const { return empty () ? 0 : buffer.back (); } // Number of elements currently in the buffer, max of sz. size_t size (void) const { return buffer.size (); } bool empty (void) const { return buffer.empty (); } void clear (void) { while (! empty ()) pop (); } private: std::deque<token *> buffer; size_t sz; // No copying! token_cache (const token_cache&); token_cache& operator = (const token_cache&); }; lexical_feedback (void) : end_of_input (false), at_beginning_of_statement (true), looking_at_anon_fcn_args (false), looking_at_return_list (false), looking_at_parameter_list (false), looking_at_decl_list (false), looking_at_initializer_expression (false), looking_at_matrix_or_assign_lhs (false), looking_for_object_index (false), looking_at_indirect_ref (false), parsing_class_method (false), maybe_classdef_get_set_method (false), parsing_classdef (false), quote_is_transpose (false), force_script (false), reading_fcn_file (false), reading_script_file (false), reading_classdef_file (false), input_line_number (1), current_input_column (1), bracketflag (0), braceflag (0), looping (0), defining_func (0), looking_at_function_handle (0), block_comment_nesting_level (0), token_count (0), current_input_line (), comment_text (), help_text (), string_text (), string_line (0), string_column (0), fcn_file_name (), fcn_file_full_name (), looking_at_object_index (), parsed_function_name (), pending_local_variables (), symtab_context (), nesting_level (), tokens () { init (); } ~lexical_feedback (void); void init (void); void reset (void); int previous_token_value (void) const; bool previous_token_value_is (int tok_val) const; void mark_previous_token_trailing_space (void); bool space_follows_previous_token (void) const; bool previous_token_is_binop (void) const; bool previous_token_is_keyword (void) const; bool previous_token_may_be_command (void) const; void maybe_mark_previous_token_as_variable (void); void mark_as_variable (const std::string& nm); void mark_as_variables (const std::list<std::string>& lst); // true means that we have encountered eof on the input stream. bool end_of_input; // true means we are at the beginning of a statement, where a // command name is possible. bool at_beginning_of_statement; // true means we are parsing an anonymous function argument list. bool looking_at_anon_fcn_args; // true means we're parsing the return list for a function. bool looking_at_return_list; // true means we're parsing the parameter list for a function. bool looking_at_parameter_list; // true means we're parsing a declaration list (global or // persistent). bool looking_at_decl_list; // true means we are looking at the initializer expression for a // parameter list element. bool looking_at_initializer_expression; // true means we're parsing a matrix or the left hand side of // multi-value assignment statement. bool looking_at_matrix_or_assign_lhs; // object index not possible until we've seen something. bool looking_for_object_index; // true means we're looking at an indirect reference to a // structure element. bool looking_at_indirect_ref; // true means we are parsing a class method in function or classdef file. bool parsing_class_method; // true means we are parsing a class method declaration line in a // classdef file and can accept a property get or set method name. // for example, "get.propertyname" is recognized as a function name. bool maybe_classdef_get_set_method; // true means we are parsing a classdef file bool parsing_classdef; // return transpose or start a string? bool quote_is_transpose; // TRUE means treat the current file as a script even if the first // token is "function" or "classdef". bool force_script; // TRUE means we're parsing a function file. bool reading_fcn_file; // TRUE means we're parsing a script file. bool reading_script_file; // TRUE means we're parsing a classdef file. bool reading_classdef_file; // the current input line number. int input_line_number; // the column of the current token. int current_input_column; // square bracket level count. int bracketflag; // curly brace level count. int braceflag; // true means we're in the middle of defining a loop. int looping; // nonzero means we're in the middle of defining a function. int defining_func; // nonzero means we are parsing a function handle. int looking_at_function_handle; // nestng level for blcok comments. int block_comment_nesting_level; // Count of tokens recognized by this lexer since initialized or // since the last reset. size_t token_count; // The current line of input. std::string current_input_line; // The current comment text. std::string comment_text; // The current help text. std::string help_text; // The current character string text. std::string string_text; // The position of the beginning of the current character string. int string_line; int string_column; // Simple name of function file we are reading. std::string fcn_file_name; // Full name of file we are reading. std::string fcn_file_full_name; // if the front of the list is true, the closest paren, brace, or // bracket nesting is an index for an object. std::list<bool> looking_at_object_index; // if the top of the stack is true, then we've already seen the name // of the current function. should only matter if // current_function_level > 0 std::stack<bool> parsed_function_name; // set of identifiers that might be local variable names. std::set<std::string> pending_local_variables; // Track current symbol table scope and context. symbol_table_context symtab_context; // is the closest nesting level a square bracket, squiggly brace, // a paren, or an anonymous function body? bbp_nesting_level nesting_level; // Tokens generated by the lexer. token_cache tokens; private: // No copying! lexical_feedback (const lexical_feedback&); lexical_feedback& operator = (const lexical_feedback&); }; // octave_base_lexer inherits from lexical_feedback because we will // eventually have several different constructors and it is easier to // intialize if everything is grouped in a parent class rather than // listing all the members in the octave_base_lexer class. class octave_base_lexer : public lexical_feedback { public: // Handle buffering of input for lexer. class input_buffer { public: input_buffer (void) : buffer (), pos (0), chars_left (0), eof (false) { } void fill (const std::string& input, bool eof_arg); // Copy at most max_size characters to buf. int copy_chunk (char *buf, size_t max_size); bool empty (void) const { return chars_left == 0; } bool at_eof (void) const { return eof; } private: std::string buffer; const char *pos; size_t chars_left; bool eof; }; // Collect comment text. class comment_buffer { public: comment_buffer (void) : comment_list (0) { } ~comment_buffer (void) { delete comment_list; } void append (const std::string& s, octave_comment_elt::comment_type t) { if (! comment_list) comment_list = new octave_comment_list (); comment_list->append (s, t); } // Caller is expected to delete the returned value. octave_comment_list *get_comment (void) { octave_comment_list *retval = comment_list; comment_list = 0; return retval; } void reset (void) { delete comment_list; comment_list = 0; } private: octave_comment_list *comment_list; }; octave_base_lexer (void) : lexical_feedback (), scanner (0), input_buf (), comment_buf () { init (); } virtual ~octave_base_lexer (void); void init (void); virtual bool is_push_lexer (void) const { return false; } virtual void reset (void); void prep_for_file (void); void begin_string (int state); virtual int fill_flex_buffer (char *buf, unsigned int max_size) = 0; bool at_end_of_buffer (void) const { return input_buf.empty (); } bool at_end_of_file (void) const { return input_buf.at_eof (); } int handle_end_of_input (void); char *flex_yytext (void); int flex_yyleng (void); int text_yyinput (void); void xunput (char c, char *buf); void xunput (char c); bool looking_at_space (void); bool inside_any_object_index (void); bool is_variable (const std::string& name); int is_keyword_token (const std::string& s); bool whitespace_is_significant (void); void handle_number (void); void handle_continuation (void); void finish_comment (octave_comment_elt::comment_type typ); octave_comment_list *get_comment (void) { return comment_buf.get_comment (); } int handle_close_bracket (int bracket_type); bool looks_like_command_arg (void); int handle_superclass_identifier (void); int handle_meta_identifier (void); int handle_identifier (void); void maybe_warn_separator_insert (char sep); void gripe_single_quote_string (void); void gripe_matlab_incompatible (const std::string& msg); void maybe_gripe_matlab_incompatible_comment (char c); void gripe_matlab_incompatible_continuation (void); void gripe_matlab_incompatible_operator (const std::string& op); void push_token (token *); token *current_token (void); void display_token (int tok); void fatal_error (const char *msg); void lexer_debug (const char *pattern); // Internal state of the flex-generated lexer. void *scanner; // Object that reads and buffers input. input_buffer input_buf; // Object that collects comment text. comment_buffer comment_buf; virtual void increment_promptflag (void) = 0; virtual void decrement_promptflag (void) = 0; virtual int promptflag (void) const = 0; virtual int promptflag (int) = 0; virtual std::string input_source (void) const { return "unknown"; } virtual bool input_from_terminal (void) const { return false; } virtual bool input_from_file (void) const { return false; } virtual bool input_from_eval_string (void) const { return false; } void push_start_state (int state); void pop_start_state (void); void clear_start_state (void); int start_state (void) const { return start_state_stack.top (); } void display_start_state (void) const; int handle_op (const char *pattern, int tok, bool bos = false); int handle_incompatible_op (const char *pattern, int tok, bool bos = false); bool maybe_unput_comma_before_unary_op (int tok); int handle_unary_op (int tok, bool bos = false); int handle_incompatible_unary_op (int tok, bool bos = false); int handle_assign_op (const char *pattern, int tok); int handle_incompatible_assign_op (const char *pattern, int tok); int handle_op_internal (int tok, bool bos, bool compat); int handle_token (const std::string& name, int tok); int handle_token (int tok, token *tok_val = 0); int count_token (int tok); int count_token_internal (int tok); int show_token (int tok); protected: std::stack<int> start_state_stack; // No copying! octave_base_lexer (const octave_base_lexer&); octave_base_lexer& operator = (const octave_base_lexer&); }; class octave_lexer : public octave_base_lexer { public: octave_lexer (void) : octave_base_lexer (), input_reader (this) { } octave_lexer (FILE *file) : octave_base_lexer (), input_reader (file, this) { } octave_lexer (const std::string& eval_string) : octave_base_lexer (), input_reader (eval_string, this) { } void reset (void) { input_reader.reset (); octave_base_lexer::reset (); } void increment_promptflag (void) { input_reader.increment_promptflag (); } void decrement_promptflag (void) { input_reader.decrement_promptflag (); } int promptflag (void) const { return input_reader.promptflag (); } int promptflag (int n) { return input_reader.promptflag (n); } std::string input_source (void) const { return input_reader.input_source (); } bool input_from_terminal (void) const { return input_reader.input_from_terminal (); } bool input_from_file (void) const { return input_reader.input_from_file (); } bool input_from_eval_string (void) const { return input_reader.input_from_eval_string (); } int fill_flex_buffer (char *buf, unsigned int max_size); octave_input_reader input_reader; protected: // No copying! octave_lexer (const octave_lexer&); octave_lexer& operator = (const octave_lexer&); }; class octave_push_lexer : public octave_base_lexer { public: octave_push_lexer (const std::string& input = std::string (), bool eof = false) : octave_base_lexer (), pflag (1) { append_input (input, eof); } bool is_push_lexer (void) const { return true; } void reset (void) { promptflag (1); octave_base_lexer::reset (); } void append_input (const std::string& input, bool eof) { input_buf.fill (input, eof); } void increment_promptflag (void) { pflag++; } void decrement_promptflag (void) { pflag--; } int promptflag (void) const { return pflag; } int promptflag (int n) { int retval = pflag; pflag = n; return retval; } std::string input_source (void) const { return "push buffer"; } int fill_flex_buffer (char *buf, unsigned int max_size); protected: int pflag; // No copying! octave_push_lexer (const octave_push_lexer&); octave_push_lexer& operator = (const octave_push_lexer&); }; #endif