home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / src / lex.cc < prev    next >
C/C++ Source or Header  |  1996-09-28  |  81KB  |  3,440 lines

  1. /* A lexical scanner generated by flex */
  2.  
  3. /* Scanner skeleton version:
  4.  * $Header: flex.skl,v 1.2 94/01/04 14:33:15 vern Exp $
  5.  */
  6.  
  7. #define FLEX_SCANNER
  8.  
  9. #include <stdio.h>
  10.  
  11.  
  12. /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
  13. #ifdef c_plusplus
  14. #ifndef __cplusplus
  15. #define __cplusplus
  16. #endif
  17. #endif
  18.  
  19.  
  20. #ifdef __cplusplus
  21.  
  22. #include <stdlib.h>
  23. #include <unistd.h>
  24.  
  25. /* Use prototypes in function declarations. */
  26. #define YY_USE_PROTOS
  27.  
  28. /* The "const" storage-class-modifier is valid. */
  29. #define YY_USE_CONST
  30.  
  31. #else    /* ! __cplusplus */
  32.  
  33. #ifdef __STDC__
  34.  
  35. #define YY_USE_PROTOS
  36. #define YY_USE_CONST
  37.  
  38. #endif    /* __STDC__ */
  39. #endif    /* ! __cplusplus */
  40.  
  41.  
  42. #ifdef __TURBOC__
  43. #define YY_USE_CONST
  44. #endif
  45.  
  46.  
  47. #ifndef YY_USE_CONST
  48. #ifndef const
  49. #define const
  50. #endif
  51. #endif
  52.  
  53.  
  54. #ifdef YY_USE_PROTOS
  55. #define YY_PROTO(proto) proto
  56. #else
  57. #define YY_PROTO(proto) ()
  58. #endif
  59.  
  60. /* Returned upon end-of-file. */
  61. #define YY_NULL 0
  62.  
  63. /* Promotes a possibly negative, possibly signed char to an unsigned
  64.  * integer for use as an array index.  If the signed char is negative,
  65.  * we want to instead treat it as an 8-bit unsigned char, hence the
  66.  * double cast.
  67.  */
  68. #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
  69.  
  70. /* Enter a start condition.  This macro really ought to take a parameter,
  71.  * but we do it the disgusting crufty way forced on us by the ()-less
  72.  * definition of BEGIN.
  73.  */
  74. #define BEGIN yy_start = 1 + 2 *
  75.  
  76. /* Translate the current start state into a value that can be later handed
  77.  * to BEGIN to return to the state.
  78.  */
  79. #define YY_START ((yy_start - 1) / 2)
  80.  
  81. /* Action number for EOF rule of a given start state. */
  82. #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  83.  
  84. /* Special action meaning "start processing a new file".  Now included
  85.  * only for backward compatibility with previous versions of flex.
  86.  */
  87. #define YY_NEW_FILE yyrestart( yyin )
  88.  
  89. #define YY_END_OF_BUFFER_CHAR 0
  90.  
  91. /* Size of default input buffer. */
  92. #define YY_BUF_SIZE 16384
  93.  
  94. typedef struct yy_buffer_state *YY_BUFFER_STATE;
  95.  
  96. extern int yyleng;
  97. extern FILE *yyin, *yyout;
  98.  
  99. #ifdef __cplusplus
  100. extern "C" {
  101. #endif
  102.     extern int yywrap YY_PROTO(( void ));
  103. #ifdef __cplusplus
  104.     }
  105. #endif
  106.  
  107. #define EOB_ACT_CONTINUE_SCAN 0
  108. #define EOB_ACT_END_OF_FILE 1
  109. #define EOB_ACT_LAST_MATCH 2
  110.  
  111. /* The funky do-while in the following #define is used to turn the definition
  112.  * int a single C statement (which needs a semi-colon terminator).  This
  113.  * avoids problems with code like:
  114.  *
  115.  *     if ( condition_holds )
  116.  *        yyless( 5 );
  117.  *    else
  118.  *        do_something_else();
  119.  *
  120.  * Prior to using the do-while the compiler would get upset at the
  121.  * "else" because it interpreted the "if" statement as being all
  122.  * done when it reached the ';' after the yyless() call.
  123.  */
  124.  
  125. /* Return all but the first 'n' matched characters back to the input stream. */
  126.  
  127. #define yyless(n) \
  128.     do \
  129.         { \
  130.         /* Undo effects of setting up yytext. */ \
  131.         *yy_cp = yy_hold_char; \
  132.         yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
  133.         YY_DO_BEFORE_ACTION; /* set up yytext again */ \
  134.         } \
  135.     while ( 0 )
  136.  
  137. #define unput(c) yyunput( c, yytext_ptr )
  138.  
  139.  
  140. struct yy_buffer_state
  141.     {
  142.     FILE *yy_input_file;
  143.  
  144.     char *yy_ch_buf;        /* input buffer */
  145.     char *yy_buf_pos;        /* current position in input buffer */
  146.  
  147.     /* Size of input buffer in bytes, not including room for EOB
  148.      * characters.
  149.      */
  150.     int yy_buf_size;
  151.  
  152.     /* Number of characters read into yy_ch_buf, not including EOB
  153.      * characters.
  154.      */
  155.     int yy_n_chars;
  156.  
  157.     /* Whether this is an "interactive" input source; if so, and
  158.      * if we're using stdio for input, then we want to use getc()
  159.      * instead of fread(), to make sure we stop fetching input after
  160.      * each newline.
  161.      */
  162.     int yy_is_interactive;
  163.  
  164.     /* Whether to try to fill the input buffer when we reach the
  165.      * end of it.
  166.      */
  167.     int yy_fill_buffer;
  168.  
  169.     /* Whether we've seen an EOF on this buffer. */
  170.     int yy_eof_status;
  171. #define EOF_NOT_SEEN 0
  172.     /* "Pending" happens when the EOF has been seen but there's still
  173.      * some text to process.  Note that when we actually see the EOF,
  174.      * we switch the status back to "not seen" (via yyrestart()), so
  175.      * that the user can continue scanning by just pointing yyin at
  176.      * a new input file.
  177.      */
  178. #define EOF_PENDING 1
  179.     };
  180.  
  181. static YY_BUFFER_STATE yy_current_buffer = 0;
  182.  
  183. /* We provide macros for accessing buffer states in case in the
  184.  * future we want to put the buffer states in a more general
  185.  * "scanner state".
  186.  */
  187. #define YY_CURRENT_BUFFER yy_current_buffer
  188.  
  189.  
  190. /* yy_hold_char holds the character lost when yytext is formed. */
  191. static char yy_hold_char;
  192.  
  193. static int yy_n_chars;        /* number of characters read into yy_ch_buf */
  194.  
  195.  
  196. int yyleng;
  197.  
  198. /* Points to current character in buffer. */
  199. static char *yy_c_buf_p = (char *) 0;
  200. static int yy_init = 1;        /* whether we need to initialize */
  201. static int yy_start = 0;    /* start state number */
  202.  
  203. /* Flag which is used to allow yywrap()'s to do buffer switches
  204.  * instead of setting up a fresh yyin.  A bit of a hack ...
  205.  */
  206. static int yy_did_buffer_switch_on_eof;
  207.  
  208. static void yyunput YY_PROTO(( int c, char *buf_ptr ));
  209. void yyrestart YY_PROTO(( FILE *input_file ));
  210. void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
  211. void yy_load_buffer_state YY_PROTO(( void ));
  212. YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
  213. void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
  214. void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
  215.  
  216. static int yy_start_stack_ptr = 0;
  217. static int yy_start_stack_depth = 0;
  218. static int *yy_start_stack = 0;
  219. static void yy_push_state YY_PROTO(( int new_state ));
  220. static void yy_pop_state YY_PROTO(( void ));
  221. static int yy_top_state YY_PROTO(( void ));
  222.  
  223. #ifndef yytext_ptr
  224. static void yy_flex_strcpy YY_PROTO(( char *, const char * ));
  225. #endif
  226.  
  227. static void *yy_flex_alloc YY_PROTO(( unsigned int ));
  228. static void *yy_flex_realloc YY_PROTO(( void *ptr, unsigned int ));
  229. static void yy_flex_free YY_PROTO(( void * ));
  230.  
  231. #define yy_new_buffer yy_create_buffer
  232.  
  233. #define INITIAL 0
  234. #define HELP_FCN 1
  235. #define TEXT_FCN 2
  236. #define MATRIX 3
  237. typedef unsigned char YY_CHAR;
  238. typedef int yy_state_type;
  239. FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
  240. extern char *yytext;
  241. #define yytext_ptr yytext
  242.  
  243. #ifdef __cplusplus
  244. static int yyinput YY_PROTO(( void ));
  245. #else
  246. static int input YY_PROTO(( void ));
  247. #endif
  248.  
  249. static yy_state_type yy_get_previous_state YY_PROTO(( void ));
  250. static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
  251. static int yy_get_next_buffer YY_PROTO(( void ));
  252. static void yy_fatal_error YY_PROTO(( const char msg[] ));
  253.  
  254. /* Done after the current pattern has been matched and before the
  255.  * corresponding action - sets up yytext.
  256.  */
  257. #define YY_DO_BEFORE_ACTION \
  258.     yytext_ptr = yy_bp; \
  259.     yyleng = yy_cp - yy_bp; \
  260.     yy_hold_char = *yy_cp; \
  261.     *yy_cp = '\0'; \
  262.     yy_c_buf_p = yy_cp;
  263.  
  264. #define YY_END_OF_BUFFER 58
  265. static const short int yy_accept[179] =
  266.     {   0,
  267.        17,   17,    5,    5,    6,    6,   17,   17,   58,   56,
  268.        17,   22,   51,   24,   26,   39,   23,   54,   55,   42,
  269.        52,   46,   53,   56,   43,   16,   25,   45,   40,   48,
  270.        41,   21,   12,   44,   13,   47,   38,   51,    5,    5,
  271.         1,    6,    6,    2,    6,    4,    6,    6,    4,    6,
  272.         6,    6,    6,    3,    6,    6,    6,    6,    6,    3,
  273.         6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
  274.         9,   11,   26,    8,   10,    7,   17,   36,   50,   47,
  275.        32,   33,   31,   27,   52,   53,    0,   28,   16,   29,
  276.        30,   16,   16,    0,   14,   34,   35,   37,   21,   21,
  277.  
  278.        12,    0,   18,    0,   49,    5,    5,    6,    6,    6,
  279.         6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
  280.         6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
  281.         6,    6,    6,    6,    6,    6,    6,    9,   11,    0,
  282.         8,   10,    7,   11,   11,    0,    0,    0,    8,   10,
  283.         0,    7,   20,    0,   15,   16,    0,   16,    0,   19,
  284.         6,    6,    6,    6,    6,    6,    6,    6,    0,   11,
  285.        11,    0,    0,   16,    6,    6,   11,    0
  286.     } ;
  287.  
  288. static const int yy_ec[256] =
  289.     {   0,
  290.         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
  291.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  292.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  293.         1,    2,    4,    5,    6,    1,    6,    7,    8,    9,
  294.        10,   11,   12,   13,   14,   15,   16,   17,   17,   17,
  295.        17,   17,   17,   17,   17,   17,   17,   18,   19,   20,
  296.        21,   22,    1,    1,   23,   23,   23,   24,   24,   23,
  297.        23,   23,   25,   25,   23,   23,   23,   23,   23,   23,
  298.        23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
  299.        26,   27,   28,   29,   23,    1,   23,   23,   23,   24,
  300.  
  301.        24,   23,   23,   23,   25,   25,   23,   23,   23,   23,
  302.        23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
  303.        23,   23,    1,   30,    1,   31,    1,    1,    1,    1,
  304.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  305.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  306.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  307.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  308.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  309.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  310.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  311.  
  312.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  313.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  314.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  315.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  316.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  317.         1,    1,    1,    1,    1
  318.     } ;
  319.  
  320. static const int yy_meta[32] =
  321.     {   0,
  322.         1,    2,    3,    1,    1,    1,    1,    4,    1,    1,
  323.         4,    1,    5,    1,    1,    4,    6,    1,    5,    1,
  324.         1,    1,    2,    6,    6,    1,    4,    1,    4,    1,
  325.         1
  326.     } ;
  327.  
  328. static const short int yy_base[189] =
  329.     {   0,
  330.         0,    0,   30,   32,   35,    0,   65,   92,  341,  405,
  331.       337,  405,  317,  405,  405,  330,  405,  405,  405,  325,
  332.       323,  405,  320,  113,  405,   55,  405,  405,   52,  312,
  333.       311,  329,  328,   79,  405,  405,  299,  307,  325,  324,
  334.       405,  320,  319,  405,   67,  318,  317,   84,  316,  315,
  335.       313,   81,   75,  405,   87,  141,  311,  169,  310,  405,
  336.        88,   94,   95,  193,  309,   97,  308,  307,   74,  105,
  337.       217,  244,  305,  305,  111,  304,  303,  405,  405,  405,
  338.       405,  405,  405,  293,  405,  405,  288,  405,  114,  405,
  339.       405,  120,  148,  134,  405,  405,  405,  405,  300,  297,
  340.  
  341.       295,  116,  405,  291,  405,  291,  290,  289,  288,  287,
  342.       284,  283,  282,  281,  279,  278,  121,  275,  274,  132,
  343.       272,  152,  269,  266,  271,  299,  173,  265,  264,  263,
  344.       262,  259,  323,  258,  158,  178,  247,    0,    0,  230,
  345.       211,  176,  207,    0,    0,  200,  193,  186,  181,  196,
  346.       171,  160,  198,  194,  405,  142,  119,  116,  109,  405,
  347.       219,  212,  106,  210,  133,  226,  229,  235,  103,  238,
  348.       250,   99,   58,  190,  237,  253,  256,  405,  348,  353,
  349.       359,  365,  371,  374,  380,  386,  392,  398
  350.     } ;
  351.  
  352. static const short int yy_def[189] =
  353.     {   0,
  354.       178,    1,  179,  179,  178,    5,    1,    1,  178,  178,
  355.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  356.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  357.       178,  180,  178,  178,  178,  178,  178,  178,  181,  178,
  358.       178,  182,  178,  178,  182,  182,  182,  182,  182,  182,
  359.       182,  182,  182,  178,  182,  182,  182,  182,  182,  178,
  360.       182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
  361.       178,  178,  183,  178,  178,  178,  178,  178,  178,  178,
  362.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  363.       178,  184,  178,  178,  178,  178,  178,  178,  178,  180,
  364.  
  365.       178,  178,  178,  185,  178,  181,  178,  182,  178,  178,
  366.       182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
  367.       182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
  368.       182,  178,  182,  178,  178,  186,  182,   71,   72,  183,
  369.       178,  178,  178,   72,   72,  187,  183,  178,  178,  178,
  370.       188,  178,  178,  178,  178,  178,  178,  178,  185,  178,
  371.       182,  182,  182,  182,  182,  182,  186,  185,  187,  178,
  372.       178,  188,  178,  178,  182,  182,  178,    0,  178,  178,
  373.       178,  178,  178,  178,  178,  178,  178,  178
  374.     } ;
  375.  
  376. static const short int yy_nxt[437] =
  377.     {   0,
  378.        10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
  379.        20,   21,   22,   23,   24,   25,   26,   27,   28,   29,
  380.        30,   31,   32,   32,   32,   33,   34,   35,   36,   37,
  381.        38,   40,   41,   40,   41,   42,   43,   44,   45,   46,
  382.        47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
  383.        57,   58,   59,   60,   61,   62,   63,   64,   64,   64,
  384.        65,   66,   67,   68,   69,   70,   71,   72,  109,   92,
  385.        73,   93,   96,   78,  174,  109,  109,   74,   94,   95,
  386.       102,  103,  109,   75,  104,  109,  114,  111,  109,  109,
  387.       112,  113,   76,   71,   72,  109,  109,   73,  135,  103,
  388.  
  389.       115,  150,  136,  137,   74,  170,  109,  109,  129,  111,
  390.        75,  160,  150,  150,  130,  131,  151,  102,  103,   76,
  391.        83,  104,  109,   84,   85,  111,   86,   87,   88,   89,
  392.        89,  124,  158,  109,  109,  158,  156,  154,   95,   90,
  393.        95,   91,  109,   94,   95,  157,  161,  157,  116,  166,
  394.       158,  117,  118,  109,  119,  120,  121,  122,  156,  135,
  395.       103,  152,   92,  104,   93,   94,   95,  123,  122,  124,
  396.       109,   94,   95,  150,  109,  162,  128,  150,  150,  168,
  397.       160,  151,  149,  125,  165,  126,  165,  148,  171,  166,
  398.       159,  140,  127,  128,  132,  148,  159,  150,  150,  102,
  399.  
  400.       103,  151,  170,  104,  142,  173,  174,  173,  152,  133,
  401.       174,  109,  149,  109,   95,  133,  133,  133,  138,  139,
  402.       135,  103,  140,  175,  136,  175,  164,  109,  176,  141,
  403.       168,  160,  148,  127,  128,  142,  168,  160,  109,  170,
  404.       177,  159,  166,  146,  143,  144,  145,  159,  109,  146,
  405.       128,  170,  177,  176,  109,  146,  142,  170,  177,  134,
  406.       132,  146,  142,  109,  109,  109,  109,  109,  142,  176,
  407.       109,  143,  109,  109,  142,  109,  109,  128,  163,  109,
  408.       109,  163,  109,  109,  109,  109,  163,  164,  110,  109,
  409.       109,  107,  107,  160,  127,  128,  101,  163,   99,  163,
  410.  
  411.       109,   99,  153,   91,   77,  152,  149,  148,  109,  109,
  412.       134,  109,  109,  125,  109,  126,  109,  109,  109,  109,
  413.       110,  109,  127,  128,  132,  107,  107,   78,  105,  101,
  414.        99,   98,   97,   82,   81,   80,   79,   78,   77,  133,
  415.       178,  178,  178,  178,  178,  133,  133,  133,   39,   39,
  416.        39,   39,   39,   39,  100,  178,  178,  178,  100,  106,
  417.       106,  178,  106,  106,  106,  108,  108,  178,  108,  178,
  418.       108,  147,  147,  147,  147,  147,  147,  155,  178,  155,
  419.       159,  159,  159,  159,  159,  159,  167,  167,  167,  167,
  420.       167,  167,  169,  169,  169,  169,  169,  169,  172,  172,
  421.  
  422.       172,  172,  172,  172,    9,  178,  178,  178,  178,  178,
  423.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  424.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  425.       178,  178,  178,  178,  178,  178
  426.     } ;
  427.  
  428. static const short int yy_chk[437] =
  429.     {   0,
  430.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  431.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  432.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  433.         1,    3,    3,    4,    4,    5,    5,    5,    5,    5,
  434.         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
  435.         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
  436.         5,    5,    5,    5,    5,    5,    7,    7,   45,   26,
  437.         7,   26,   29,   29,  173,   69,   53,    7,   26,   26,
  438.        34,   34,   52,    7,   34,   48,   53,   45,   55,   61,
  439.        48,   52,    7,    8,    8,   62,   63,    8,   66,   66,
  440.  
  441.        55,  172,   66,   69,    8,  169,   70,  163,   61,   61,
  442.         8,  159,   75,   75,   62,   63,   75,  102,  102,    8,
  443.        24,  102,  117,   24,   24,   70,   24,   24,   24,   24,
  444.        89,  117,  158,  120,  165,  157,   92,   89,   89,   24,
  445.       158,   24,   56,   92,   92,   94,  120,   94,   56,  165,
  446.        94,   56,   56,  122,   56,   56,   56,   56,  156,  135,
  447.       135,  152,   93,  135,   93,  156,  156,   56,  122,   56,
  448.        58,   93,   93,  151,  127,  122,  122,  142,  142,  136,
  449.       136,  142,  149,   58,  127,   58,  127,  148,  148,  127,
  450.       136,  148,   58,   58,   64,  147,  136,  150,  150,  153,
  451.  
  452.       153,  150,  146,  153,  148,  154,  174,  154,  143,   64,
  453.       154,  164,  141,  162,  174,   64,   64,   64,   71,   71,
  454.       161,  161,   71,  162,  161,  162,  164,  166,  162,   71,
  455.       167,  167,  140,  164,  164,   71,  168,  168,  175,  170,
  456.       170,  167,  166,  170,   71,   72,   72,  167,  137,   72,
  457.       166,  171,  171,  175,  176,  171,  170,  177,  177,  134,
  458.       132,  177,   72,  131,  130,  129,  128,  124,  171,  176,
  459.       123,   72,  125,  121,  177,  119,  118,  176,  125,  116,
  460.       115,  125,  114,  113,  112,  111,  125,  125,  110,  109,
  461.       108,  107,  106,  104,  125,  125,  101,  125,  100,  125,
  462.  
  463.       126,   99,   87,   84,   77,   76,   74,   73,   68,   67,
  464.        65,   59,   57,  126,   51,  126,   50,   49,   47,   46,
  465.        43,   42,  126,  126,  133,   40,   39,   38,   37,   33,
  466.        32,   31,   30,   23,   21,   20,   16,   13,   11,  133,
  467.         9,    0,    0,    0,    0,  133,  133,  133,  179,  179,
  468.       179,  179,  179,  179,  180,    0,    0,    0,  180,  181,
  469.       181,    0,  181,  181,  181,  182,  182,    0,  182,    0,
  470.       182,  183,  183,  183,  183,  183,  183,  184,    0,  184,
  471.       185,  185,  185,  185,  185,  185,  186,  186,  186,  186,
  472.       186,  186,  187,  187,  187,  187,  187,  187,  188,  188,
  473.  
  474.       188,  188,  188,  188,  178,  178,  178,  178,  178,  178,
  475.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  476.       178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
  477.       178,  178,  178,  178,  178,  178
  478.     } ;
  479.  
  480. static yy_state_type yy_last_accepting_state;
  481. static char *yy_last_accepting_cpos;
  482.  
  483. /* The intent behind this definition is that it'll catch
  484.  * any uses of REJECT which flex missed.
  485.  */
  486. #define REJECT reject_used_but_not_detected
  487. #define yymore() yymore_used_but_not_detected
  488. #define YY_MORE_ADJ 0
  489. char *yytext;
  490. # line 1 "lex.l"
  491. /* lex.l                                                -*- C++ -*-
  492.  
  493. Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton
  494.  
  495. This file is part of Octave.
  496.  
  497. Octave is free software; you can redistribute it and/or modify it
  498. under the terms of the GNU General Public License as published by the
  499. Free Software Foundation; either version 2, or (at your option) any
  500. later version.
  501.  
  502. Octave is distributed in the hope that it will be useful, but WITHOUT
  503. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  504. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  505. for more details.
  506.  
  507. You should have received a copy of the GNU General Public License
  508. along with GNU CC; see the file COPYING.  If not, write to the Free
  509. Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  510.  
  511. */
  512. # line 28 "lex.l"
  513. #define SHORT_CIRCUIT_LOGICALS 1
  514.  
  515. #ifdef HAVE_CONFIG_H
  516. #include "config.h"
  517. #endif
  518.  
  519. #include <strstream.h>
  520. #include <ctype.h>
  521. #include <string.h>
  522.  
  523. #include "input.h"
  524. #include "token.h"
  525.  
  526. #include "SLStack.h"
  527.  
  528. // Stack to hold tokens so that we can delete them when the parser is
  529. // reset and avoid growing forever just because we are stashing some
  530. // information.  This has to appear before lex.h is included, because
  531. // one of the macros defined there uses token_stack.
  532. static SLStack <token*> token_stack;
  533.  
  534. #include "user-prefs.h"
  535. #include "variables.h"
  536. #include "octave.h"
  537. #include "symtab.h"
  538. #include "error.h"
  539. #include "utils.h"
  540. #include "tree-base.h"
  541. #include "tree-expr.h"
  542. #include "tree-cmd.h"
  543. #include "tree-misc.h"
  544. #include "tree-plot.h"
  545. #include "tree-const.h"
  546. #include "y.tab.h"
  547. #include "parse.h"
  548. #include "lex.h"
  549.  
  550. // Nonzero means we think we are looking at a set command.
  551. static int doing_set = 0;
  552.  
  553. // GAG.  Stupid kludge so that [[1,2][3,4]] will work.
  554. static do_comma_insert = 0;
  555.  
  556. // Brace level count.
  557. static int braceflag = 0;
  558.  
  559. // Return transpose or start a string?
  560. int quote_is_transpose = 0;
  561.  
  562. // Nonzero means we thing we are looking at the beginning of a
  563. // function definition.
  564. int beginning_of_function = 0;
  565.  
  566. // Nonzero means that we should convert spaces to a comma inside a
  567. // matrix definition.
  568. static int convert_spaces_to_comma = 1;
  569.  
  570. // Another context hack, this time for the plot command's `using',
  571. // `title', and `with' keywords.
  572. static int cant_be_identifier = 0;
  573.  
  574. #define BRACE 1
  575. #define PAREN 2
  576.  
  577. // Did eat_whitespace() eat a space or tab, or a newline, or both?
  578. #define ATE_SPACE_OR_TAB 1
  579. #define ATE_NEWLINE 2
  580.  
  581. // Is the closest nesting level a square brace or a paren?
  582. //
  583. //  BRACE -> spaces are important (they can turn into commas)
  584. //           new lines are important (they can turn into semicolons)
  585. //
  586. //  PAREN -> spaces and new lines are not important
  587.  
  588. static SLStack <int> nesting_level;
  589.  
  590. // Forward declarations for functions defined at the bottom of this
  591. // file.
  592.  
  593. static void do_string_escapes (char *s);
  594. static void fixup_column_count (char *s);
  595. static void do_comma_insert_check (void);
  596. static int is_plot_keyword (char *s);
  597. static int is_keyword (char *s);
  598. static char *plot_style_token (char *s);
  599. static symbol_record *lookup_identifier (char *s);
  600. static void grab_help_text (void);
  601. static int match_any (char c, char *s);
  602. static int next_token_is_bin_op (int spc_prev, char *yytext);
  603. static int next_token_is_postfix_unary_op (int spc_prev, char *yytext);
  604. static char *strip_trailing_whitespace (char *s);
  605. static void handle_number (char *yytext);
  606. static int handle_string (char delim, int text_style = 0);
  607. static int handle_close_brace (int spc_gobbled);
  608. static int handle_identifier (char *tok, int spc_gobbled);
  609. static int have_continuation (int trailing_comments_ok = 1);
  610. static int have_ellipsis_continuation (int trailing_comments_ok = 1);
  611. static int eat_whitespace (void);
  612. static int eat_continuation (void);
  613.  
  614.  
  615. /* Macros after this point can all be overridden by user definitions in
  616.  * section 1.
  617.  */
  618.  
  619. #ifdef YY_MALLOC_DECL
  620. YY_MALLOC_DECL
  621. #else
  622. #if __STDC__
  623. #ifndef __cplusplus
  624. #include <stdlib.h>
  625. #endif
  626. #else
  627. /* Just try to get by without declaring the routines.  This will fail
  628.  * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
  629.  * or sizeof(void*) != sizeof(int).
  630.  */
  631. #endif
  632. #endif
  633.  
  634. /* Amount of stuff to slurp up with each read. */
  635. #ifndef YY_READ_BUF_SIZE
  636. #define YY_READ_BUF_SIZE 8192
  637. #endif
  638.  
  639. /* Copy whatever the last rule matched to the standard output. */
  640.  
  641. #ifndef ECHO
  642. /* This used to be an fputs(), but since the string might contain NUL's,
  643.  * we now use fwrite().
  644.  */
  645. #define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
  646. #endif
  647.  
  648. /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
  649.  * is returned in "result".
  650.  */
  651. #ifndef YY_INPUT
  652. #define YY_INPUT(buf,result,max_size) \
  653.     if ( yy_current_buffer->yy_is_interactive ) \
  654.         { \
  655.         int c = getc( yyin ); \
  656.         result = c == EOF ? 0 : 1; \
  657.         buf[0] = (char) c; \
  658.         } \
  659.     else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
  660.           && ferror( yyin ) ) \
  661.         YY_FATAL_ERROR( "input in flex scanner failed" );
  662. #endif
  663.  
  664. /* No semi-colon after return; correct usage is to write "yyterminate();" -
  665.  * we don't want an extra ';' after the "return" because that will cause
  666.  * some compilers to complain about unreachable statements.
  667.  */
  668. #ifndef yyterminate
  669. #define yyterminate() return YY_NULL
  670. #endif
  671.  
  672. /* Number of entries by which start-condition stack grows. */
  673. #ifndef YY_START_STACK_INCR
  674. #define YY_START_STACK_INCR 25
  675. #endif
  676.  
  677. /* Report a fatal error. */
  678. #ifndef YY_FATAL_ERROR
  679. #define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  680. #endif
  681.  
  682. /* Default declaration of generated scanner - a define so the user can
  683.  * easily add parameters.
  684.  */
  685. #ifndef YY_DECL
  686. #define YY_DECL int yylex YY_PROTO(( void ))
  687. #endif
  688.  
  689. /* Code executed at the beginning of each rule, after yytext and yyleng
  690.  * have been set up.
  691.  */
  692. #ifndef YY_USER_ACTION
  693. #define YY_USER_ACTION
  694. #endif
  695.  
  696. /* Code executed at the end of each rule. */
  697. #ifndef YY_BREAK
  698. #define YY_BREAK break;
  699. #endif
  700.  
  701. YY_DECL
  702.     {
  703.     register yy_state_type yy_current_state;
  704.     register char *yy_cp, *yy_bp;
  705.     register int yy_act;
  706.  
  707. # line 151 "lex.l"
  708.  
  709.  
  710.  
  711. // Help and other text-style functions are a pain in the ass.  This
  712. // stuff needs to be simplified.  May require some changes in the
  713. // parser too.
  714.  
  715.  
  716.  
  717.     if ( yy_init )
  718.         {
  719. #ifdef YY_USER_INIT
  720.         YY_USER_INIT;
  721. #endif
  722.  
  723.         if ( ! yy_start )
  724.             yy_start = 1;    /* first start state */
  725.  
  726.         if ( ! yyin )
  727.             yyin = stdin;
  728.  
  729.         if ( ! yyout )
  730.             yyout = stdout;
  731.  
  732.         if ( yy_current_buffer )
  733.             yy_init_buffer( yy_current_buffer, yyin );
  734.         else
  735.             yy_current_buffer =
  736.                 yy_create_buffer( yyin, YY_BUF_SIZE );
  737.  
  738.         yy_load_buffer_state();
  739.  
  740.         yy_init = 0;
  741.         }
  742.  
  743.     while ( 1 )        /* loops until end-of-file is reached */
  744.         {
  745.         yy_cp = yy_c_buf_p;
  746.  
  747.         /* Support of yytext. */
  748.         *yy_cp = yy_hold_char;
  749.  
  750.         /* yy_bp points to the position in yy_ch_buf of the start of
  751.          * the current run.
  752.          */
  753.         yy_bp = yy_cp;
  754.  
  755.         yy_current_state = yy_start;
  756. yy_match:
  757.         do
  758.             {
  759.             register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
  760.             if ( yy_accept[yy_current_state] )
  761.                 {
  762.                 yy_last_accepting_state = yy_current_state;
  763.                 yy_last_accepting_cpos = yy_cp;
  764.                 }
  765.             while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  766.                 {
  767.                 yy_current_state = (int) yy_def[yy_current_state];
  768.                 if ( yy_current_state >= 179 )
  769.                     yy_c = yy_meta[(unsigned int) yy_c];
  770.                 }
  771.             yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
  772.             ++yy_cp;
  773.             }
  774.         while ( yy_base[yy_current_state] != 405 );
  775.  
  776. yy_find_action:
  777.         yy_act = yy_accept[yy_current_state];
  778.  
  779.         YY_DO_BEFORE_ACTION;
  780.  
  781.  
  782. do_action:    /* This label is used only to access EOF actions. */
  783.  
  784.  
  785.         switch ( yy_act )
  786.     { /* beginning of action switch */
  787.             case 0: /* must back up */
  788.             /* undo the effects of YY_DO_BEFORE_ACTION */
  789.             *yy_cp = yy_hold_char;
  790.             yy_cp = yy_last_accepting_cpos;
  791.             yy_current_state = yy_last_accepting_state;
  792.             goto yy_find_action;
  793.  
  794. case 1:
  795. YY_USER_ACTION
  796. # line 160 "lex.l"
  797. case 2:
  798. YY_USER_ACTION
  799. # line 160 "lex.l"
  800. {
  801.     BEGIN 0;
  802.     current_input_column = 1;
  803.     quote_is_transpose = 0;
  804.     cant_be_identifier = 0;
  805.     convert_spaces_to_comma = 1;
  806.     return '\n';
  807.   }
  808.     YY_BREAK
  809. case 3:
  810. YY_USER_ACTION
  811. # line 169 "lex.l"
  812. {
  813.     if (doing_set && strcmp (yytext, ",") == 0)
  814.       {
  815.     TOK_PUSH_AND_RETURN (yytext, TEXT);
  816.       }
  817.     else
  818.       {
  819.     BEGIN 0;
  820.     if (strcmp (yytext, ",") == 0)
  821.       TOK_RETURN (',');
  822.     else
  823.       TOK_RETURN (';');
  824.       }
  825.   }
  826.     YY_BREAK
  827. case 4:
  828. YY_USER_ACTION
  829. # line 184 "lex.l"
  830. {
  831.     current_input_column++;
  832.     return handle_string (yytext[0], 1);
  833.   }
  834.     YY_BREAK
  835. case 5:
  836. YY_USER_ACTION
  837. # line 190 "lex.l"
  838. case 6:
  839. YY_USER_ACTION
  840. # line 190 "lex.l"
  841. {
  842.     static char *tok = 0;
  843.     delete [] tok;
  844.     tok = strip_trailing_whitespace (yytext);
  845.     TOK_PUSH_AND_RETURN (tok, TEXT);
  846.   }
  847.     YY_BREAK
  848.  
  849. // For this and the next two rules, we're looking at ']', and we
  850. // need to know if the next token is `=' or `=='.
  851. //
  852. // It would have been so much easier if the delimiters were simply
  853. // different for the expression on the left hand side of the equals
  854. // operator.
  855. //
  856. // It's also a pain in the ass to decide whether to insert a comma
  857. // after seeing a ']' character...
  858.  
  859. case 7:
  860. YY_USER_ACTION
  861. # line 209 "lex.l"
  862. {
  863.     fixup_column_count (yytext);
  864.     int c = yytext[yyleng-1];
  865.     int cont_is_spc = eat_continuation ();
  866.     int spc_gobbled = (cont_is_spc || c == ' ' || c == '\t');
  867.     return handle_close_brace (spc_gobbled);
  868.   }
  869.     YY_BREAK
  870.  
  871. // Commas are element separators in matrix constants.  If we don't
  872. // check for continuations here we can end up inserting too many
  873. // commas.
  874.  
  875. case 8:
  876. YY_USER_ACTION
  877. # line 223 "lex.l"
  878. {
  879.     current_input_column += yyleng;
  880.     int tmp = eat_continuation ();
  881.     quote_is_transpose = 0;
  882.     cant_be_identifier = 0;
  883.     convert_spaces_to_comma = 1;
  884.     if (user_pref.whitespace_in_literal_matrix != 2
  885.     && (tmp & ATE_NEWLINE) == ATE_NEWLINE)
  886.       unput (';');
  887.     return (',');
  888.   }
  889.     YY_BREAK
  890.  
  891. // In some cases, spaces in matrix constants can turn into commas.
  892. // If commas are required, spaces are not important in matrix
  893. // constants so we just eat them.  If we don't check for continuations
  894. // here we can end up inserting too many commas.
  895.  
  896. case 9:
  897. YY_USER_ACTION
  898. # line 242 "lex.l"
  899. {
  900.     current_input_column += yyleng;
  901.     if (user_pref.whitespace_in_literal_matrix != 2)
  902.       {
  903.     int tmp = eat_continuation ();
  904.     int bin_op = next_token_is_bin_op (1, yytext);
  905.     int postfix_un_op = next_token_is_postfix_unary_op (1, yytext);
  906.  
  907.     if (! (postfix_un_op || bin_op || nesting_level.empty ())
  908.         && nesting_level.top () == BRACE
  909.         && convert_spaces_to_comma)
  910.       {
  911.         quote_is_transpose = 0;
  912.         cant_be_identifier = 0;
  913.         convert_spaces_to_comma = 1;
  914.         if ((tmp & ATE_NEWLINE) == ATE_NEWLINE)
  915.           unput (';');
  916.         return (',');
  917.       }
  918.       }
  919.   }
  920.     YY_BREAK
  921.  
  922. // Semicolons are handled as row seprators in matrix constants.  If we
  923. // don't eat whitespace here we can end up inserting too many
  924. // semicolons.
  925.  
  926. case 10:
  927. YY_USER_ACTION
  928. # line 270 "lex.l"
  929. {
  930.     fixup_column_count (yytext);
  931.     eat_whitespace ();
  932.     quote_is_transpose = 0;
  933.     cant_be_identifier = 0;
  934.     convert_spaces_to_comma = 1;
  935.     return ';';
  936.   }
  937.     YY_BREAK
  938.  
  939. // In some cases, new lines can also become row separators.  If we
  940. // don't eat whitespace here we can end up inserting too many
  941. // semicolons.
  942.  
  943. case 11:
  944. YY_USER_ACTION
  945. # line 285 "lex.l"
  946. {
  947.     fixup_column_count (yytext);
  948.     eat_whitespace ();
  949.     if (user_pref.whitespace_in_literal_matrix != 2)
  950.       {
  951.     quote_is_transpose = 0;
  952.     cant_be_identifier = 0;
  953.     convert_spaces_to_comma = 1;
  954.  
  955.     if (nesting_level.empty ())
  956.       return LEXICAL_ERROR;
  957.  
  958.     if (nesting_level.top () == BRACE)
  959.       return ';';
  960.       }
  961.   }
  962.     YY_BREAK
  963.  
  964. // Open and close brace are handled differently if we are in the range
  965. // part of a plot command.
  966. //
  967.  
  968. case 12:
  969. YY_USER_ACTION
  970. # line 308 "lex.l"
  971. {
  972.     nesting_level.push (BRACE);
  973.  
  974.     current_input_column += yyleng;
  975.     quote_is_transpose = 0;
  976.     cant_be_identifier = 0;
  977.     convert_spaces_to_comma = 1;
  978.  
  979.     promptflag--;
  980.     eat_whitespace ();
  981.  
  982.     if (plotting && ! past_plot_range)
  983.       {
  984.     in_plot_range = 1;
  985.     return OPEN_BRACE;
  986.       }
  987.     else
  988.       {
  989.     mlnm.push (1);
  990.     braceflag++;
  991.     BEGIN MATRIX;
  992.     return '[';
  993.       }
  994.   }
  995.     YY_BREAK
  996. case 13:
  997. YY_USER_ACTION
  998. # line 333 "lex.l"
  999. {
  1000.     if (! nesting_level.empty ())
  1001.       nesting_level.pop ();
  1002.  
  1003.     if (plotting && ! past_plot_range)
  1004.       {
  1005.     in_plot_range = 0;
  1006.     TOK_RETURN (CLOSE_BRACE);
  1007.       }
  1008.     else
  1009.       TOK_RETURN (']');
  1010.   }
  1011.     YY_BREAK
  1012.  
  1013. // Imaginary numbers.
  1014.  
  1015. case 14:
  1016. YY_USER_ACTION
  1017. # line 350 "lex.l"
  1018. {
  1019.     handle_number (yytext);
  1020.     return IMAG_NUM;
  1021.   }
  1022.     YY_BREAK
  1023.  
  1024. // Real numbers.  Don't grab the `.' part of a dot operator as part of
  1025. // the constant.
  1026.  
  1027. case 15:
  1028. *yy_cp = yy_hold_char; /* undo effects of setting up yytext */
  1029. yy_c_buf_p = yy_cp -= 2;
  1030. YY_DO_BEFORE_ACTION; /* set up yytext again */
  1031. YY_USER_ACTION
  1032. # line 361 "lex.l"
  1033. case 16:
  1034. YY_USER_ACTION
  1035. # line 361 "lex.l"
  1036. {
  1037.     handle_number (yytext);
  1038.     return NUM;
  1039.   }
  1040.     YY_BREAK
  1041.  
  1042. // Eat whitespace.  Whitespace inside matrix constants is handled by
  1043. // the <MATRIX> start state code above.
  1044.  
  1045. case 17:
  1046. YY_USER_ACTION
  1047. # line 371 "lex.l"
  1048. {
  1049.     current_input_column += yyleng;
  1050.   }
  1051.     YY_BREAK
  1052.  
  1053. // Continuation lines.  Allow comments after continuations.
  1054.  
  1055. case 18:
  1056. YY_USER_ACTION
  1057. # line 380 "lex.l"
  1058. case 19:
  1059. YY_USER_ACTION
  1060. # line 380 "lex.l"
  1061. {
  1062.     promptflag--;
  1063.     current_input_column = 1;
  1064.   }
  1065.     YY_BREAK
  1066.  
  1067. // An ellipsis not at the end of a line is not a continuation, but
  1068. // does have another meaning.
  1069.  
  1070. case 20:
  1071. YY_USER_ACTION
  1072. # line 390 "lex.l"
  1073. {
  1074.     return ELLIPSIS;
  1075.   }
  1076.     YY_BREAK
  1077.  
  1078. // End of file.
  1079.  
  1080. case YY_STATE_EOF(INITIAL):
  1081. case YY_STATE_EOF(HELP_FCN):
  1082. case YY_STATE_EOF(TEXT_FCN):
  1083. case YY_STATE_EOF(MATRIX):
  1084. # line 398 "lex.l"
  1085. {
  1086.     TOK_RETURN (END_OF_INPUT);
  1087.   }
  1088.     YY_BREAK
  1089.  
  1090. // Identifiers.  Truncate the token at the first space or tab but
  1091. // don't write directly on yytext.
  1092.  
  1093. case 21:
  1094. YY_USER_ACTION
  1095. # line 407 "lex.l"
  1096. {
  1097.     static char *tok = 0;
  1098.     delete [] tok;
  1099.     tok = strip_trailing_whitespace (yytext);
  1100.     int c = yytext[yyleng-1];
  1101.     int cont_is_spc = eat_continuation ();
  1102.     int spc_gobbled = (cont_is_spc || c == ' ' || c == '\t');
  1103.     return handle_identifier (tok, spc_gobbled);
  1104.   }
  1105.     YY_BREAK
  1106.  
  1107. // A new line character.  New line characters inside matrix constants
  1108. // are handled by the <MATRIX> start state code above.  If closest
  1109. // nesting is inside parentheses, don't return a row separator.
  1110.  
  1111. case 22:
  1112. YY_USER_ACTION
  1113. # line 423 "lex.l"
  1114. {
  1115.     quote_is_transpose = 0;
  1116.     cant_be_identifier = 0;
  1117.     current_input_column = 1;
  1118.     convert_spaces_to_comma = 1;
  1119.  
  1120.     if (nesting_level.empty ())
  1121.       return '\n';
  1122.  
  1123.     if (nesting_level.top () == BRACE)
  1124.       return LEXICAL_ERROR;
  1125.   }
  1126.     YY_BREAK
  1127.  
  1128. // Single quote can either be the beginning of a string or a transpose
  1129. // operator. 
  1130.  
  1131. case 23:
  1132. YY_USER_ACTION
  1133. # line 441 "lex.l"
  1134. {
  1135.     current_input_column++;
  1136.     convert_spaces_to_comma = 1;
  1137.  
  1138.     if (quote_is_transpose)
  1139.       {
  1140.     do_comma_insert_check ();
  1141.     return QUOTE;
  1142.       }
  1143.     else
  1144.       return handle_string ('\'');
  1145.   }
  1146.     YY_BREAK
  1147.  
  1148. // Double quotes always begin strings.
  1149.  
  1150. case 24:
  1151. YY_USER_ACTION
  1152. # line 458 "lex.l"
  1153. {
  1154.     current_input_column++;
  1155.     return handle_string ('"');
  1156. }
  1157.     YY_BREAK
  1158.  
  1159. // The colon operator is handled differently if we are in the range
  1160. // part of a plot command.
  1161.  
  1162. case 25:
  1163. YY_USER_ACTION
  1164. # line 468 "lex.l"
  1165. {
  1166.     if (plotting && (in_plot_range || in_plot_using))
  1167.       BIN_OP_RETURN (COLON, 1);
  1168.     else
  1169.       BIN_OP_RETURN (':', 0);
  1170.   }
  1171.     YY_BREAK
  1172.  
  1173. // Gobble comments.  If closest nesting is inside parentheses, don't
  1174. // return a new line.
  1175.  
  1176. case 26:
  1177. YY_USER_ACTION
  1178. # line 480 "lex.l"
  1179. {
  1180.     if (! help_buf && beginning_of_function && nesting_level.empty ())
  1181.       {
  1182.     grab_help_text ();
  1183.     beginning_of_function = 0;
  1184.       }
  1185.     else
  1186.       {
  1187.     int c;
  1188.     while ((c = yyinput ()) != EOF && c != '\n')
  1189.       ; // Eat comment.
  1190.       }
  1191.  
  1192.     quote_is_transpose = 0;
  1193.     cant_be_identifier = 0;
  1194.     current_input_column = 1;
  1195.     convert_spaces_to_comma = 1;
  1196.  
  1197.     if (nesting_level.empty () || nesting_level.top () == BRACE)
  1198.       return '\n';
  1199.   }
  1200.     YY_BREAK
  1201.  
  1202. // Other operators.
  1203.  
  1204. case 27:
  1205. YY_USER_ACTION
  1206. # line 506 "lex.l"
  1207. { BIN_OP_RETURN (EMUL, 0); }
  1208.     YY_BREAK
  1209. case 28:
  1210. YY_USER_ACTION
  1211. # line 507 "lex.l"
  1212. { BIN_OP_RETURN (EDIV, 0); }
  1213.     YY_BREAK
  1214. case 29:
  1215. YY_USER_ACTION
  1216. # line 508 "lex.l"
  1217. { BIN_OP_RETURN (ELEFTDIV, 0); }
  1218.     YY_BREAK
  1219. case 30:
  1220. YY_USER_ACTION
  1221. # line 509 "lex.l"
  1222. { BIN_OP_RETURN (EPOW, 0); }
  1223.     YY_BREAK
  1224. case 31:
  1225. YY_USER_ACTION
  1226. # line 510 "lex.l"
  1227. { do_comma_insert_check (); BIN_OP_RETURN (TRANSPOSE, 1); }
  1228.     YY_BREAK
  1229. case 32:
  1230. YY_USER_ACTION
  1231. # line 511 "lex.l"
  1232. { do_comma_insert_check (); BIN_OP_RETURN (PLUS_PLUS, 1); }
  1233.     YY_BREAK
  1234. case 33:
  1235. YY_USER_ACTION
  1236. # line 512 "lex.l"
  1237. { do_comma_insert_check (); BIN_OP_RETURN (MINUS_MINUS, 1); }
  1238.     YY_BREAK
  1239. case 34:
  1240. YY_USER_ACTION
  1241. # line 513 "lex.l"
  1242. { BIN_OP_RETURN (EXPR_LE, 0); }
  1243.     YY_BREAK
  1244. case 35:
  1245. YY_USER_ACTION
  1246. # line 514 "lex.l"
  1247. { BIN_OP_RETURN (EXPR_EQ, 0); }
  1248.     YY_BREAK
  1249. case 36:
  1250. YY_USER_ACTION
  1251. # line 515 "lex.l"
  1252. { BIN_OP_RETURN (EXPR_NE, 0); }
  1253.     YY_BREAK
  1254. case 37:
  1255. YY_USER_ACTION
  1256. # line 516 "lex.l"
  1257. { BIN_OP_RETURN (EXPR_GE, 0); }
  1258.     YY_BREAK
  1259. case 38:
  1260. YY_USER_ACTION
  1261. # line 517 "lex.l"
  1262. { BIN_OP_RETURN (EXPR_OR, 0); }
  1263.     YY_BREAK
  1264. case 39:
  1265. YY_USER_ACTION
  1266. # line 518 "lex.l"
  1267. { BIN_OP_RETURN (EXPR_AND, 0); }
  1268.     YY_BREAK
  1269. case 40:
  1270. YY_USER_ACTION
  1271. # line 519 "lex.l"
  1272. { BIN_OP_RETURN (EXPR_LT, 0); }
  1273.     YY_BREAK
  1274. case 41:
  1275. YY_USER_ACTION
  1276. # line 520 "lex.l"
  1277. { BIN_OP_RETURN (EXPR_GT, 0); }
  1278.     YY_BREAK
  1279. case 42:
  1280. YY_USER_ACTION
  1281. # line 521 "lex.l"
  1282. { BIN_OP_RETURN ('*', 0); }
  1283.     YY_BREAK
  1284. case 43:
  1285. YY_USER_ACTION
  1286. # line 522 "lex.l"
  1287. { BIN_OP_RETURN ('/', 0); }
  1288.     YY_BREAK
  1289. case 44:
  1290. YY_USER_ACTION
  1291. # line 523 "lex.l"
  1292. { BIN_OP_RETURN (LEFTDIV, 0); }
  1293.     YY_BREAK
  1294. case 45:
  1295. YY_USER_ACTION
  1296. # line 524 "lex.l"
  1297. { BIN_OP_RETURN (';', 1); }
  1298.     YY_BREAK
  1299. case 46:
  1300. YY_USER_ACTION
  1301. # line 525 "lex.l"
  1302. { BIN_OP_RETURN (',', 1); }
  1303.     YY_BREAK
  1304. case 47:
  1305. YY_USER_ACTION
  1306. # line 526 "lex.l"
  1307. { BIN_OP_RETURN (POW, 0); }
  1308.     YY_BREAK
  1309. case 48:
  1310. YY_USER_ACTION
  1311. # line 527 "lex.l"
  1312. { BIN_OP_RETURN ('=', 1); }
  1313.     YY_BREAK
  1314. case 49:
  1315. YY_USER_ACTION
  1316. # line 529 "lex.l"
  1317. {
  1318. #ifdef SHORT_CIRCUIT_LOGICALS
  1319.     BIN_OP_RETURN (EXPR_OR_OR, 0);
  1320. #else
  1321.     BIN_OP_RETURN (EXPR_OR, 0);
  1322. #endif
  1323.   }
  1324.     YY_BREAK
  1325. case 50:
  1326. YY_USER_ACTION
  1327. # line 537 "lex.l"
  1328. {
  1329. #ifdef SHORT_CIRCUIT_LOGICALS
  1330.     BIN_OP_RETURN (EXPR_AND_AND, 0);
  1331. #else
  1332.     BIN_OP_RETURN (EXPR_AND, 0);
  1333. #endif
  1334.   }
  1335.     YY_BREAK
  1336. case 51:
  1337. YY_USER_ACTION
  1338. # line 545 "lex.l"
  1339. {
  1340.     if (plotting && ! in_plot_range)
  1341.       past_plot_range = 1;
  1342.     BIN_OP_RETURN (EXPR_NOT, 0);
  1343.   }
  1344.     YY_BREAK
  1345. case 52:
  1346. YY_USER_ACTION
  1347. # line 551 "lex.l"
  1348.     if (plotting && ! in_plot_range)
  1349.       past_plot_range = 1;
  1350.     BIN_OP_RETURN ('+', 0);
  1351.   }
  1352.     YY_BREAK
  1353. case 53:
  1354. YY_USER_ACTION
  1355. # line 557 "lex.l"
  1356.     if (plotting && ! in_plot_range)
  1357.       past_plot_range = 1;
  1358.     BIN_OP_RETURN ('-', 0);
  1359.   }
  1360.     YY_BREAK
  1361. case 54:
  1362. YY_USER_ACTION
  1363. # line 563 "lex.l"
  1364. {
  1365.     if (plotting && ! in_plot_range)
  1366.       past_plot_range = 1;
  1367.     nesting_level.push (PAREN);
  1368.     promptflag--;
  1369.     TOK_RETURN ('(');
  1370.   }
  1371.     YY_BREAK
  1372. case 55:
  1373. YY_USER_ACTION
  1374. # line 571 "lex.l"
  1375. {
  1376.     if (! nesting_level.empty ())
  1377.       nesting_level.pop ();
  1378.  
  1379.     current_input_column++;
  1380.     cant_be_identifier = 1;
  1381.     quote_is_transpose = 1;
  1382.     convert_spaces_to_comma = (! nesting_level.empty ()
  1383.                    && nesting_level.top () == BRACE);
  1384.     do_comma_insert_check ();
  1385.     return ')';
  1386.   }
  1387.     YY_BREAK
  1388.  
  1389. // We return everything else as single character tokens, which should
  1390. // eventually result in a parse error.
  1391.  
  1392. case 56:
  1393. YY_USER_ACTION
  1394. # line 589 "lex.l"
  1395. { TOK_RETURN (yytext[0]); }
  1396.     YY_BREAK
  1397. case 57:
  1398. YY_USER_ACTION
  1399. # line 591 "lex.l"
  1400. ECHO;
  1401.     YY_BREAK
  1402.  
  1403.     case YY_END_OF_BUFFER:
  1404.         {
  1405.         /* Amount of text matched not including the EOB char. */
  1406.         int yy_amount_of_matched_text = yy_cp - yytext_ptr - 1;
  1407.  
  1408.         /* Undo the effects of YY_DO_BEFORE_ACTION. */
  1409.         *yy_cp = yy_hold_char;
  1410.  
  1411.         if ( yy_current_buffer->yy_input_file != yyin )
  1412.             {
  1413.             /* This can happen if we scan a file, yywrap() returns
  1414.              * 1, and then later the user points yyin at a new
  1415.              * file to resume scanning.  We have to assure
  1416.              * consistency between yy_current_buffer and our
  1417.              * globals.  Here is the right place to do so, because
  1418.              * this is the first action (other than possibly a
  1419.              * back-up) that will match for the new input file.
  1420.              */
  1421.             yy_current_buffer->yy_input_file = yyin;
  1422.             yy_n_chars = yy_current_buffer->yy_n_chars;
  1423.             }
  1424.  
  1425.         /* Note that here we test for yy_c_buf_p "<=" to the position
  1426.          * of the first EOB in the buffer, since yy_c_buf_p will
  1427.          * already have been incremented past the NUL character
  1428.          * (since all states make transitions on EOB to the
  1429.          * end-of-buffer state).  Contrast this with the test
  1430.          * in input().
  1431.          */
  1432.         if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
  1433.             { /* This was really a NUL. */
  1434.             yy_state_type yy_next_state;
  1435.  
  1436.             yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
  1437.  
  1438.             yy_current_state = yy_get_previous_state();
  1439.  
  1440.             /* Okay, we're now positioned to make the NUL
  1441.              * transition.  We couldn't have
  1442.              * yy_get_previous_state() go ahead and do it
  1443.              * for us because it doesn't know how to deal
  1444.              * with the possibility of jamming (and we don't
  1445.              * want to build jamming into it because then it
  1446.              * will run more slowly).
  1447.              */
  1448.  
  1449.             yy_next_state = yy_try_NUL_trans( yy_current_state );
  1450.  
  1451.             yy_bp = yytext_ptr + YY_MORE_ADJ;
  1452.  
  1453.             if ( yy_next_state )
  1454.                 {
  1455.                 /* Consume the NUL. */
  1456.                 yy_cp = ++yy_c_buf_p;
  1457.                 yy_current_state = yy_next_state;
  1458.                 goto yy_match;
  1459.                 }
  1460.  
  1461.             else
  1462.                 {
  1463.                 goto yy_find_action;
  1464.                 }
  1465.             }
  1466.  
  1467.         else switch ( yy_get_next_buffer() )
  1468.             {
  1469.             case EOB_ACT_END_OF_FILE:
  1470.                 {
  1471.                 yy_did_buffer_switch_on_eof = 0;
  1472.  
  1473.                 if ( yywrap() )
  1474.                     {
  1475.                     /* Note: because we've taken care in
  1476.                      * yy_get_next_buffer() to have set up
  1477.                      * yytext, we can now set up
  1478.                      * yy_c_buf_p so that if some total
  1479.                      * hoser (like flex itself) wants to
  1480.                      * call the scanner after we return the
  1481.                      * YY_NULL, it'll still work - another
  1482.                      * YY_NULL will get returned.
  1483.                      */
  1484.                     yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
  1485.  
  1486.                     yy_act = YY_STATE_EOF(YY_START);
  1487.                     goto do_action;
  1488.                     }
  1489.  
  1490.                 else
  1491.                     {
  1492.                     if ( ! yy_did_buffer_switch_on_eof )
  1493.                         YY_NEW_FILE;
  1494.                     }
  1495.                 break;
  1496.                 }
  1497.  
  1498.             case EOB_ACT_CONTINUE_SCAN:
  1499.                 yy_c_buf_p =
  1500.                     yytext_ptr + yy_amount_of_matched_text;
  1501.  
  1502.                 yy_current_state = yy_get_previous_state();
  1503.  
  1504.                 yy_cp = yy_c_buf_p;
  1505.                 yy_bp = yytext_ptr + YY_MORE_ADJ;
  1506.                 goto yy_match;
  1507.  
  1508.             case EOB_ACT_LAST_MATCH:
  1509.                 yy_c_buf_p =
  1510.                 &yy_current_buffer->yy_ch_buf[yy_n_chars];
  1511.  
  1512.                 yy_current_state = yy_get_previous_state();
  1513.  
  1514.                 yy_cp = yy_c_buf_p;
  1515.                 yy_bp = yytext_ptr + YY_MORE_ADJ;
  1516.                 goto yy_find_action;
  1517.             }
  1518.         break;
  1519.         }
  1520.  
  1521.     default:
  1522.         YY_FATAL_ERROR(
  1523.             "fatal flex scanner internal error--no action found" );
  1524.     } /* end of action switch */
  1525.         } /* end of scanning one token */
  1526.     } /* end of yylex */
  1527.  
  1528.  
  1529. /* yy_get_next_buffer - try to read in a new buffer
  1530.  *
  1531.  * Returns a code representing an action:
  1532.  *    EOB_ACT_LAST_MATCH -
  1533.  *    EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  1534.  *    EOB_ACT_END_OF_FILE - end of file
  1535.  */
  1536.  
  1537. static int yy_get_next_buffer()
  1538.     {
  1539.     register char *dest = yy_current_buffer->yy_ch_buf;
  1540.     register char *source = yytext_ptr - 1; /* copy prev. char, too */
  1541.     register int number_to_move, i;
  1542.     int ret_val;
  1543.  
  1544.     if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
  1545.         YY_FATAL_ERROR(
  1546.         "fatal flex scanner internal error--end of buffer missed" );
  1547.  
  1548.     if ( yy_current_buffer->yy_fill_buffer == 0 )
  1549.         { /* Don't try to fill the buffer, so this is an EOF. */
  1550.         if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
  1551.             {
  1552.             /* We matched a singled characater, the EOB, so
  1553.              * treat this as a final EOF.
  1554.              */
  1555.             return EOB_ACT_END_OF_FILE;
  1556.             }
  1557.  
  1558.         else
  1559.             {
  1560.             /* We matched some text prior to the EOB, first
  1561.              * process it.
  1562.              */
  1563.             return EOB_ACT_LAST_MATCH;
  1564.             }
  1565.         }
  1566.  
  1567.     /* Try to read more data. */
  1568.  
  1569.     /* First move last chars to start of buffer. */
  1570.     number_to_move = yy_c_buf_p - yytext_ptr;
  1571.  
  1572.     for ( i = 0; i < number_to_move; ++i )
  1573.         *(dest++) = *(source++);
  1574.  
  1575.     if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN )
  1576.         /* don't do the read, it's not guaranteed to return an EOF,
  1577.          * just force an EOF
  1578.          */
  1579.         yy_n_chars = 0;
  1580.  
  1581.     else
  1582.         {
  1583.         int num_to_read =
  1584.             yy_current_buffer->yy_buf_size - number_to_move - 1;
  1585.  
  1586.         while ( num_to_read <= 0 )
  1587.             { /* Not enough room in the buffer - grow it. */
  1588. #ifdef YY_USES_REJECT
  1589.             YY_FATAL_ERROR(
  1590. "input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
  1591. #else
  1592.  
  1593.             /* just a shorter name for the current buffer */
  1594.             YY_BUFFER_STATE b = yy_current_buffer;
  1595.  
  1596.             int yy_c_buf_p_offset = yy_c_buf_p - b->yy_ch_buf;
  1597.  
  1598.             b->yy_buf_size *= 2;
  1599.             b->yy_ch_buf = (char *)
  1600.                 yy_flex_realloc( (void *) b->yy_ch_buf,
  1601.                          b->yy_buf_size );
  1602.  
  1603.             if ( ! b->yy_ch_buf )
  1604.                 YY_FATAL_ERROR(
  1605.                 "fatal error - scanner input buffer overflow" );
  1606.  
  1607.             yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
  1608.  
  1609.             num_to_read = yy_current_buffer->yy_buf_size -
  1610.                         number_to_move - 1;
  1611. #endif
  1612.             }
  1613.  
  1614.         if ( num_to_read > YY_READ_BUF_SIZE )
  1615.             num_to_read = YY_READ_BUF_SIZE;
  1616.  
  1617.         /* Read in more data. */
  1618.         YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
  1619.             yy_n_chars, num_to_read );
  1620.         }
  1621.  
  1622.     if ( yy_n_chars == 0 )
  1623.         {
  1624.         if ( number_to_move - YY_MORE_ADJ == 1 )
  1625.             {
  1626.             ret_val = EOB_ACT_END_OF_FILE;
  1627.             yyrestart( yyin );
  1628.             }
  1629.  
  1630.         else
  1631.             {
  1632.             ret_val = EOB_ACT_LAST_MATCH;
  1633.             yy_current_buffer->yy_eof_status = EOF_PENDING;
  1634.             }
  1635.         }
  1636.  
  1637.     else
  1638.         ret_val = EOB_ACT_CONTINUE_SCAN;
  1639.  
  1640.     yy_n_chars += number_to_move;
  1641.     yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
  1642.     yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
  1643.  
  1644.     /* yytext begins at the second character in yy_ch_buf; the first
  1645.      * character is the one which preceded it before reading in the latest
  1646.      * buffer; it needs to be kept around in case it's a newline, so
  1647.      * yy_get_previous_state() will have with '^' rules active.
  1648.      */
  1649.  
  1650.     yytext_ptr = &yy_current_buffer->yy_ch_buf[1];
  1651.  
  1652.     return ret_val;
  1653.     }
  1654.  
  1655.  
  1656. /* yy_get_previous_state - get the state just before the EOB char was reached */
  1657.  
  1658. static yy_state_type yy_get_previous_state()
  1659.     {
  1660.     register yy_state_type yy_current_state;
  1661.     register char *yy_cp;
  1662.  
  1663.     yy_current_state = yy_start;
  1664.  
  1665.     for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
  1666.         {
  1667.         register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
  1668.         if ( yy_accept[yy_current_state] )
  1669.             {
  1670.             yy_last_accepting_state = yy_current_state;
  1671.             yy_last_accepting_cpos = yy_cp;
  1672.             }
  1673.         while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  1674.             {
  1675.             yy_current_state = (int) yy_def[yy_current_state];
  1676.             if ( yy_current_state >= 179 )
  1677.                 yy_c = yy_meta[(unsigned int) yy_c];
  1678.             }
  1679.         yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
  1680.         }
  1681.  
  1682.     return yy_current_state;
  1683.     }
  1684.  
  1685.  
  1686. /* yy_try_NUL_trans - try to make a transition on the NUL character
  1687.  *
  1688.  * synopsis
  1689.  *    next_state = yy_try_NUL_trans( current_state );
  1690.  */
  1691.  
  1692. #ifdef YY_USE_PROTOS
  1693. static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
  1694. #else
  1695. static yy_state_type yy_try_NUL_trans( yy_current_state )
  1696. yy_state_type yy_current_state;
  1697. #endif
  1698.     {
  1699.     register int yy_is_jam;
  1700.     register char *yy_cp = yy_c_buf_p;
  1701.  
  1702.     register YY_CHAR yy_c = 1;
  1703.     if ( yy_accept[yy_current_state] )
  1704.         {
  1705.         yy_last_accepting_state = yy_current_state;
  1706.         yy_last_accepting_cpos = yy_cp;
  1707.         }
  1708.     while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  1709.         {
  1710.         yy_current_state = (int) yy_def[yy_current_state];
  1711.         if ( yy_current_state >= 179 )
  1712.             yy_c = yy_meta[(unsigned int) yy_c];
  1713.         }
  1714.     yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
  1715.     yy_is_jam = (yy_current_state == 178);
  1716.  
  1717.     return yy_is_jam ? 0 : yy_current_state;
  1718.     }
  1719.  
  1720.  
  1721. #ifdef YY_USE_PROTOS
  1722. static void yyunput( int c, register char *yy_bp )
  1723. #else
  1724. static void yyunput( c, yy_bp )
  1725. int c;
  1726. register char *yy_bp;
  1727. #endif
  1728.     {
  1729.     register char *yy_cp = yy_c_buf_p;
  1730.  
  1731.     /* undo effects of setting up yytext */
  1732.     *yy_cp = yy_hold_char;
  1733.  
  1734.     if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
  1735.         { /* need to shift things up to make room */
  1736.         /* +2 for EOB chars. */
  1737.         register int number_to_move = yy_n_chars + 2;
  1738.         register char *dest = &yy_current_buffer->yy_ch_buf[
  1739.                     yy_current_buffer->yy_buf_size + 2];
  1740.         register char *source =
  1741.                 &yy_current_buffer->yy_ch_buf[number_to_move];
  1742.  
  1743.         while ( source > yy_current_buffer->yy_ch_buf )
  1744.             *--dest = *--source;
  1745.  
  1746.         yy_cp += dest - source;
  1747.         yy_bp += dest - source;
  1748.         yy_n_chars = yy_current_buffer->yy_buf_size;
  1749.  
  1750.         if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
  1751.             YY_FATAL_ERROR( "flex scanner push-back overflow" );
  1752.         }
  1753.  
  1754.     if ( yy_cp > yy_bp && yy_cp[-1] == '\n' )
  1755.         yy_cp[-2] = '\n';
  1756.  
  1757.     *--yy_cp = (char) c;
  1758.  
  1759.  
  1760.     /* Note: the formal parameter *must* be called "yy_bp" for this
  1761.      * macro to now work correctly.
  1762.      */
  1763.     YY_DO_BEFORE_ACTION; /* set up yytext again */
  1764.     }
  1765.  
  1766.  
  1767. #ifdef __cplusplus
  1768. static int yyinput()
  1769. #else
  1770. static int input()
  1771. #endif
  1772.     {
  1773.     int c;
  1774.  
  1775.     *yy_c_buf_p = yy_hold_char;
  1776.  
  1777.     if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
  1778.         {
  1779.         /* yy_c_buf_p now points to the character we want to return.
  1780.          * If this occurs *before* the EOB characters, then it's a
  1781.          * valid NUL; if not, then we've hit the end of the buffer.
  1782.          */
  1783.         if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
  1784.             /* This was really a NUL. */
  1785.             *yy_c_buf_p = '\0';
  1786.  
  1787.         else
  1788.             { /* need more input */
  1789.             yytext_ptr = yy_c_buf_p;
  1790.             ++yy_c_buf_p;
  1791.  
  1792.             switch ( yy_get_next_buffer() )
  1793.                 {
  1794.                 case EOB_ACT_END_OF_FILE:
  1795.                     {
  1796.                     if ( yywrap() )
  1797.                         {
  1798.                         yy_c_buf_p =
  1799.                         yytext_ptr + YY_MORE_ADJ;
  1800.                         return EOF;
  1801.                         }
  1802.  
  1803.                     YY_NEW_FILE;
  1804. #ifdef __cplusplus
  1805.                     return yyinput();
  1806. #else
  1807.                     return input();
  1808. #endif
  1809.                     }
  1810.  
  1811.                 case EOB_ACT_CONTINUE_SCAN:
  1812.                     yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
  1813.                     break;
  1814.  
  1815.                 case EOB_ACT_LAST_MATCH:
  1816. #ifdef __cplusplus
  1817.                     YY_FATAL_ERROR(
  1818.                     "unexpected last match in yyinput()" );
  1819. #else
  1820.                     YY_FATAL_ERROR(
  1821.                     "unexpected last match in input()" );
  1822. #endif
  1823.                 }
  1824.             }
  1825.         }
  1826.  
  1827.     c = *yy_c_buf_p;
  1828.     *yy_c_buf_p = '\0';    /* preserve yytext */
  1829.     yy_hold_char = *++yy_c_buf_p;
  1830.  
  1831.     return c;
  1832.     }
  1833.  
  1834.  
  1835. #ifdef YY_USE_PROTOS
  1836. void yyrestart( FILE *input_file )
  1837. #else
  1838. void yyrestart( input_file )
  1839. FILE *input_file;
  1840. #endif
  1841.     {
  1842.     if ( ! yy_current_buffer )
  1843.         yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
  1844.  
  1845.     yy_init_buffer( yy_current_buffer, input_file );
  1846.     yy_load_buffer_state();
  1847.     }
  1848.  
  1849.  
  1850. #ifdef YY_USE_PROTOS
  1851. void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
  1852. #else
  1853. void yy_switch_to_buffer( new_buffer )
  1854. YY_BUFFER_STATE new_buffer;
  1855. #endif
  1856.     {
  1857.     if ( yy_current_buffer == new_buffer )
  1858.         return;
  1859.  
  1860.     if ( yy_current_buffer )
  1861.         {
  1862.         /* Flush out information for old buffer. */
  1863.         *yy_c_buf_p = yy_hold_char;
  1864.         yy_current_buffer->yy_buf_pos = yy_c_buf_p;
  1865.         yy_current_buffer->yy_n_chars = yy_n_chars;
  1866.         }
  1867.  
  1868.     yy_current_buffer = new_buffer;
  1869.     yy_load_buffer_state();
  1870.  
  1871.     /* We don't actually know whether we did this switch during
  1872.      * EOF (yywrap()) processing, but the only time this flag
  1873.      * is looked at is after yywrap() is called, so it's safe
  1874.      * to go ahead and always set it.
  1875.      */
  1876.     yy_did_buffer_switch_on_eof = 1;
  1877.     }
  1878.  
  1879.  
  1880. #ifdef YY_USE_PROTOS
  1881. void yy_load_buffer_state( void )
  1882. #else
  1883. void yy_load_buffer_state()
  1884. #endif
  1885.     {
  1886.     yy_n_chars = yy_current_buffer->yy_n_chars;
  1887.     yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
  1888.     yyin = yy_current_buffer->yy_input_file;
  1889.     yy_hold_char = *yy_c_buf_p;
  1890.     }
  1891.  
  1892.  
  1893. #ifdef YY_USE_PROTOS
  1894. YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
  1895. #else
  1896. YY_BUFFER_STATE yy_create_buffer( file, size )
  1897. FILE *file;
  1898. int size;
  1899. #endif
  1900.     {
  1901.     YY_BUFFER_STATE b;
  1902.  
  1903.     b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
  1904.  
  1905.     if ( ! b )
  1906.         YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
  1907.  
  1908.     b->yy_buf_size = size;
  1909.  
  1910.     /* yy_ch_buf has to be 2 characters longer than the size given because
  1911.      * we need to put in 2 end-of-buffer characters.
  1912.      */
  1913.     b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
  1914.  
  1915.     if ( ! b->yy_ch_buf )
  1916.         YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
  1917.  
  1918.     yy_init_buffer( b, file );
  1919.  
  1920.     return b;
  1921.     }
  1922.  
  1923.  
  1924. #ifdef YY_USE_PROTOS
  1925. void yy_delete_buffer( YY_BUFFER_STATE b )
  1926. #else
  1927. void yy_delete_buffer( b )
  1928. YY_BUFFER_STATE b;
  1929. #endif
  1930.     {
  1931.     if ( b == yy_current_buffer )
  1932.         yy_current_buffer = (YY_BUFFER_STATE) 0;
  1933.  
  1934.     yy_flex_free( (void *) b->yy_ch_buf );
  1935.     yy_flex_free( (void *) b );
  1936.     }
  1937.  
  1938.  
  1939. #ifdef YY_USE_PROTOS
  1940. void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
  1941. #else
  1942. void yy_init_buffer( b, file )
  1943. YY_BUFFER_STATE b;
  1944. FILE *file;
  1945. #endif
  1946.     {
  1947.     b->yy_input_file = file;
  1948.  
  1949.     /* We put in the '\n' and start reading from [1] so that an
  1950.      * initial match-at-newline will be true.
  1951.      */
  1952.  
  1953.     b->yy_ch_buf[0] = '\n';
  1954.     b->yy_n_chars = 1;
  1955.  
  1956.     /* We always need two end-of-buffer characters.  The first causes
  1957.      * a transition to the end-of-buffer state.  The second causes
  1958.      * a jam in that state.
  1959.      */
  1960.     b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
  1961.     b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR;
  1962.  
  1963.     b->yy_buf_pos = &b->yy_ch_buf[1];
  1964.  
  1965.     b->yy_is_interactive = file ? isatty( fileno(file) ) : 0;
  1966.  
  1967.     b->yy_fill_buffer = 1;
  1968.  
  1969.     b->yy_eof_status = EOF_NOT_SEEN;
  1970.     }
  1971.  
  1972.  
  1973. #ifdef YY_USE_PROTOS
  1974. static void yy_push_state( int new_state )
  1975. #else
  1976. static void yy_push_state( new_state )
  1977. int new_state;
  1978. #endif
  1979.     {
  1980.     if ( yy_start_stack_ptr >= yy_start_stack_depth )
  1981.         {
  1982.         int new_size;
  1983.  
  1984.         yy_start_stack_depth += YY_START_STACK_INCR;
  1985.         new_size = yy_start_stack_depth * sizeof( int );
  1986.  
  1987.         if ( ! yy_start_stack )
  1988.             yy_start_stack = (int *) yy_flex_alloc( new_size );
  1989.  
  1990.         else
  1991.             yy_start_stack = (int *) yy_flex_realloc(
  1992.                     (void *) yy_start_stack, new_size );
  1993.  
  1994.         if ( ! yy_start_stack )
  1995.             YY_FATAL_ERROR(
  1996.             "out of memory expanding start-condition stack" );
  1997.         }
  1998.  
  1999.     yy_start_stack[yy_start_stack_ptr++] = YY_START;
  2000.  
  2001.     BEGIN(new_state);
  2002.     }
  2003.  
  2004.  
  2005. static void yy_pop_state()
  2006.     {
  2007.     if ( --yy_start_stack_ptr < 0 )
  2008.         YY_FATAL_ERROR( "start-condition stack underflow" );
  2009.  
  2010.     BEGIN(yy_start_stack[yy_start_stack_ptr]);
  2011.     }
  2012.  
  2013.  
  2014. static int yy_top_state()
  2015.     {
  2016.     return yy_start_stack[yy_start_stack_ptr - 1];
  2017.     }
  2018.  
  2019.  
  2020. #ifdef YY_USE_PROTOS
  2021. static void yy_fatal_error( const char msg[] )
  2022. #else
  2023. static void yy_fatal_error( msg )
  2024. char msg[];
  2025. #endif
  2026.     {
  2027.     (void) fprintf( stderr, "%s\n", msg );
  2028.     exit( 1 );
  2029.     }
  2030.  
  2031.  
  2032.  
  2033. /* Redefine yyless() so it works in section 3 code. */
  2034.  
  2035. #undef yyless
  2036. #define yyless(n) \
  2037.     do \
  2038.         { \
  2039.         /* Undo effects of setting up yytext. */ \
  2040.         yytext[yyleng] = yy_hold_char; \
  2041.         yy_c_buf_p = yytext + n - YY_MORE_ADJ; \
  2042.         yy_hold_char = *yy_c_buf_p; \
  2043.         *yy_c_buf_p = '\0'; \
  2044.         yyleng = n; \
  2045.         } \
  2046.     while ( 0 )
  2047.  
  2048.  
  2049. /* Internal utility routines. */
  2050.  
  2051. #ifndef yytext_ptr
  2052. #ifdef YY_USE_PROTOS
  2053. static void yy_flex_strcpy( char *s1, const char *s2 )
  2054. #else
  2055. static void yy_flex_strcpy( s1, s2 )
  2056. char *s1;
  2057. const char *s2;
  2058. #endif
  2059.     {
  2060.     while ( (*(s1++) = *(s2++)) )
  2061.         ;
  2062.     }
  2063. #endif
  2064.  
  2065.  
  2066. #ifdef YY_USE_PROTOS
  2067. static void *yy_flex_alloc( unsigned int size )
  2068. #else
  2069. static void *yy_flex_alloc( size )
  2070. unsigned int size;
  2071. #endif
  2072.     {
  2073.     return (void *) malloc( size );
  2074.     }
  2075.  
  2076. #ifdef YY_USE_PROTOS
  2077. static void *yy_flex_realloc( void *ptr, unsigned int size )
  2078. #else
  2079. static void *yy_flex_realloc( ptr, size )
  2080. void *ptr;
  2081. unsigned int size;
  2082. #endif
  2083.     {
  2084.     return (void *) realloc( ptr, size );
  2085.     }
  2086.  
  2087. #ifdef YY_USE_PROTOS
  2088. static void yy_flex_free( void *ptr )
  2089. #else
  2090. static void yy_flex_free( ptr )
  2091. void *ptr;
  2092. #endif
  2093.     {
  2094.     free( ptr );
  2095.     }
  2096. # line 591 "lex.l"
  2097.  
  2098.  
  2099. // GAG.
  2100. //
  2101. // If we're reading a matrix and the next character is '[', make sure
  2102. // that we insert a comma ahead of it.
  2103.  
  2104. void
  2105. do_comma_insert_check (void)
  2106. {
  2107.   int spc_gobbled = eat_continuation ();
  2108.   int c = yyinput ();
  2109.   yyunput (c, yytext);
  2110.   if (spc_gobbled)
  2111.     yyunput (' ', yytext);
  2112.   do_comma_insert = (braceflag && c == '[');
  2113. }
  2114.  
  2115. // Fix things up for errors or interrupts.  The parser is never called
  2116. // recursively, so it is always safe to reinitialize its state before
  2117. // doing any parsing.
  2118.  
  2119. void
  2120. reset_parser (void)
  2121. {
  2122. // Start off on the right foot.
  2123.   BEGIN 0;
  2124.   error_state = 0;
  2125.  
  2126. // We do want a prompt by default.
  2127.   promptflag = 1;
  2128.  
  2129. // Not initially screwed by `function [...] = f (...)' syntax.
  2130.   maybe_screwed = 0;
  2131.   maybe_screwed_again = 0;
  2132.  
  2133. // Not initially inside a loop or if statement.
  2134.   looping = 0;
  2135.   iffing = 0;
  2136.  
  2137. // Quote marks strings intially.
  2138.   quote_is_transpose = 0;
  2139.  
  2140. // Next token can be identifier.
  2141.   cant_be_identifier = 0;
  2142.  
  2143. // No need to do comma insert or convert spaces to comma at beginning
  2144. // of input. 
  2145.   do_comma_insert = 0;
  2146.   convert_spaces_to_comma = 1;
  2147.  
  2148. // Not initially defining a function.
  2149.   beginning_of_function = 0;
  2150.   defining_func = 0;
  2151.  
  2152. // Not initially doing any plotting or setting of plot attributes.
  2153.   plotting = 0;
  2154.   in_plot_range = 0;
  2155.   past_plot_range = 0;
  2156.   in_plot_using = 0;
  2157.   in_plot_style = 0;
  2158.   doing_set = 0;
  2159.  
  2160. // Not initially looking at indirect references.
  2161.   looking_at_indirect_ref = 0;
  2162.  
  2163. // Error may have occurred inside some parentheses or braces.
  2164.   nesting_level.clear ();
  2165.  
  2166. // Not initially defining a matrix list.
  2167.   braceflag = 0;
  2168.   ml.clear ();
  2169.   mlnm.clear ();
  2170.  
  2171. // Clear out the stack of token info used to track line and column
  2172. // numbers.
  2173.   while (! token_stack.empty ())
  2174.     delete token_stack.pop ();
  2175.  
  2176. // Can be reset by defining a function.
  2177.   if (! (reading_script_file || reading_fcn_file))
  2178.     {
  2179.       current_input_column = 1;
  2180.       input_line_number = current_command_number - 1;
  2181.     }
  2182.  
  2183. // Only ask for input from stdin if we are expecting interactive
  2184. // input.
  2185.   if (interactive && ! (reading_fcn_file || get_input_from_eval_string))
  2186.     yyrestart (stdin);
  2187.  
  2188. // Delete the buffer for help text.
  2189.   delete [] help_buf;
  2190.   help_buf = 0;
  2191. }
  2192.  
  2193. // Replace backslash escapes in a string with the real values.
  2194.  
  2195. static void
  2196. do_string_escapes (char *s)
  2197. {
  2198.   char *p1 = s;
  2199.   char *p2 = s;
  2200.   while (*p2 != '\0')
  2201.     {
  2202.       if (*p2 == '\\' && *(p2+1) != '\0')
  2203.     {
  2204.       switch (*++p2)
  2205.         {
  2206.         case 'a':
  2207.           *p1 = '\a';
  2208.           break;
  2209.  
  2210.         case 'b': // backspace
  2211.           *p1 = '\b';
  2212.           break;
  2213.  
  2214.         case 'f': // formfeed
  2215.           *p1 = '\f';
  2216.           break;
  2217.  
  2218.         case 'n': // newline
  2219.           *p1 = '\n';
  2220.           break;
  2221.  
  2222.         case 'r': // carriage return
  2223.           *p1 = '\r';
  2224.           break;
  2225.  
  2226.         case 't': // horizontal tab
  2227.           *p1 = '\t';
  2228.           break;
  2229.  
  2230.         case 'v': // vertical tab
  2231.           *p1 = '\v';
  2232.           break;
  2233.  
  2234.         case '\\': // backslash
  2235.           *p1 = '\\';
  2236.           break;
  2237.  
  2238.         case '\'': // quote
  2239.           *p1 = '\'';
  2240.           break;
  2241.  
  2242.         case '"': // double quote
  2243.           *p1 = '"';
  2244.           break;
  2245.  
  2246.         default:
  2247.           warning ("unrecognized escape sequence `\\%c' --\
  2248.  converting to `%c'", *p2, *p2);
  2249.           *p1 = *p2;
  2250.           break;
  2251.         }
  2252.     }
  2253.       else
  2254.     {
  2255.       *p1 = *p2;
  2256.     }
  2257.  
  2258.       p1++;
  2259.       p2++;
  2260.     }
  2261.  
  2262.   *p1 = '\0';
  2263. }
  2264.  
  2265. // If we read some newlines, we need figure out what column we're
  2266. // really looking at.
  2267.  
  2268. static void
  2269. fixup_column_count (char *s)
  2270. {
  2271.   char c;
  2272.   while ((c = *s++) != '\0')
  2273.     {
  2274.       if (c == '\n')
  2275.       current_input_column = 1;
  2276.       else
  2277.     current_input_column++;
  2278.     }
  2279. }
  2280.  
  2281. // Include these so that we don't have to link to libfl.a.
  2282.  
  2283. #ifdef yywrap
  2284. #undef yywrap
  2285. #endif
  2286. static int
  2287. yywrap (void)
  2288. {
  2289.   return 1;
  2290. }
  2291.  
  2292. // These are not needed with flex-2.4.6, but may be needed with
  2293. // earlier 2.4.x versions.
  2294.  
  2295. #if 0
  2296. static void *
  2297. yy_flex_alloc (int size)
  2298. {
  2299.   return (void *) malloc ((unsigned) size);
  2300. }
  2301.  
  2302. static void *
  2303. yy_flex_realloc (void *ptr, int size)
  2304. {
  2305.   return (void *) realloc (ptr, (unsigned) size);
  2306. }
  2307.  
  2308. static void
  2309. yy_flex_free (void *ptr)
  2310. {
  2311.   free (ptr);
  2312. }
  2313. #endif
  2314.  
  2315. // Tell us all what the current buffer is.
  2316.  
  2317. YY_BUFFER_STATE
  2318. current_buffer (void)
  2319. {
  2320.   return YY_CURRENT_BUFFER;
  2321. }
  2322.  
  2323. // Create a new buffer.
  2324.  
  2325. YY_BUFFER_STATE
  2326. create_buffer (FILE *f)
  2327. {
  2328.   return yy_create_buffer (f, YY_BUF_SIZE);
  2329. }
  2330.  
  2331. // Start reading a new buffer.
  2332.  
  2333. void
  2334. switch_to_buffer (YY_BUFFER_STATE buf)
  2335. {
  2336.   yy_switch_to_buffer (buf);
  2337. }
  2338.  
  2339. // Delete a buffer.
  2340.  
  2341. void
  2342. delete_buffer (YY_BUFFER_STATE buf)
  2343. {
  2344.   yy_delete_buffer (buf);
  2345. }
  2346.  
  2347. // Restore a buffer (for unwind-prot).
  2348.  
  2349. void
  2350. restore_input_buffer (void *buf)
  2351. {
  2352.   switch_to_buffer ((YY_BUFFER_STATE) buf);
  2353. }
  2354.  
  2355. // Delete a buffer (for unwind-prot).
  2356.  
  2357. void
  2358. delete_input_buffer (void *buf)
  2359. {
  2360.   delete_buffer ((YY_BUFFER_STATE) buf);
  2361. }
  2362.  
  2363. // Check to see if a character string matches any of the possible line
  2364. // styles for plots.
  2365.  
  2366. static char *
  2367. plot_style_token (char *s)
  2368. {
  2369.   static char *plot_styles[] = 
  2370.     {
  2371.       "boxes",
  2372.       "boxerrorbars",
  2373.       "dots",
  2374.       "errorbars",
  2375.       "impulses",
  2376.       "lines",
  2377.       "linespoints",
  2378.       "points",
  2379.       "steps",
  2380.       0,
  2381.     };
  2382.  
  2383.   char **tmp = plot_styles;
  2384.   while (*tmp)
  2385.     {
  2386.       if (almost_match (*tmp, s))
  2387.     return *tmp;
  2388.  
  2389.       tmp++;
  2390.     }
  2391.  
  2392.   return 0;
  2393. }
  2394.  
  2395. // Check to see if a character string matches any one of the plot
  2396. // option keywords.  Don't match abbreviations for clear, since that's
  2397. // not a gnuplot keyword (users will probably only expect to be able
  2398. // to abbreviate actual gnuplot keywords).
  2399.  
  2400. static int
  2401. is_plot_keyword (char *s)
  2402. {
  2403.   if (almost_match ("title", s))
  2404.     {
  2405.       return TITLE;
  2406.     }
  2407.   else if (almost_match ("using", s))
  2408.     {
  2409.       in_plot_using = 1;
  2410.       return USING;
  2411.     }
  2412.   else if (almost_match ("with", s))
  2413.     {
  2414.       in_plot_style = 1;
  2415.       return WITH;
  2416.     }
  2417.   else if (strcmp ("clear", s) == 0)
  2418.     {
  2419.       return CLEAR;
  2420.     }
  2421.   else
  2422.     {
  2423.       return 0;
  2424.     }
  2425. }
  2426.  
  2427. // Handle keywords.  Could probably be more efficient...
  2428.  
  2429. static int
  2430. is_keyword (char *s)
  2431. {
  2432.   if (plotting && in_plot_style)
  2433.     {
  2434.       char *sty = plot_style_token (s);
  2435.       if (sty)
  2436.     {
  2437.       in_plot_style = 0;
  2438.       yylval.tok_val = new token (sty);
  2439.       token_stack.push (yylval.tok_val);
  2440.       return STYLE;
  2441.     }
  2442.     }
  2443.  
  2444.   int l = input_line_number;
  2445.   int c = current_input_column;
  2446.  
  2447. // XXX FIXME XXX -- this has really become too large a list to search
  2448. // like this...
  2449.  
  2450.   int end_found = 0;
  2451.   if (strcmp ("break", s) == 0)
  2452.     {
  2453.       yylval.tok_val = new token (l, c);
  2454.       token_stack.push (yylval.tok_val);
  2455.       return BREAK;
  2456.     }
  2457.   else if (strcmp ("continue", s) == 0)
  2458.     {
  2459.       yylval.tok_val = new token (l, c);
  2460.       token_stack.push (yylval.tok_val);
  2461.       return CONTINUE;
  2462.     }
  2463.   else if (strcmp ("else", s) == 0)
  2464.     {
  2465.       yylval.tok_val = new token (l, c);
  2466.       token_stack.push (yylval.tok_val);
  2467.       return ELSE;
  2468.     }
  2469.   else if (strcmp ("elseif", s) == 0)
  2470.     {
  2471.       yylval.tok_val = new token (l, c);
  2472.       token_stack.push (yylval.tok_val);
  2473.       return ELSEIF;
  2474.     }
  2475.   else if (strcmp ("end", s) == 0)
  2476.     {
  2477.       end_found = 1;
  2478.       yylval.tok_val = new token (token::simple_end, l, c);
  2479.       token_stack.push (yylval.tok_val);
  2480.     }
  2481.   else if (strcmp ("endfor", s) == 0)
  2482.     {
  2483.       end_found = 1;
  2484.       yylval.tok_val = new token (token::for_end, l, c);
  2485.       token_stack.push (yylval.tok_val);
  2486.     }
  2487.   else if (strcmp ("endfunction", s) == 0)
  2488.     {
  2489.       end_found = 1;
  2490.       yylval.tok_val = new token (token::function_end, l, c);
  2491.       token_stack.push (yylval.tok_val);
  2492.     }
  2493.   else if (strcmp ("endif", s) == 0)
  2494.     {
  2495.       end_found = 1;
  2496.       yylval.tok_val = new token (token::if_end, l, c);
  2497.       token_stack.push (yylval.tok_val);
  2498.     }
  2499.   else if (strcmp ("endwhile", s) == 0)
  2500.     {
  2501.       end_found = 1;
  2502.       yylval.tok_val = new token (token::while_end, l, c);
  2503.       token_stack.push (yylval.tok_val);
  2504.     }
  2505.   else if (strcmp ("for", s) == 0)
  2506.     {
  2507.       promptflag--;
  2508.       looping++;
  2509.       yylval.tok_val = new token (l, c);
  2510.       token_stack.push (yylval.tok_val);
  2511.       return FOR;
  2512.     }
  2513.   else if (strcmp ("function", s) == 0)
  2514.     {
  2515.       if (defining_func)
  2516.     {
  2517.       error ("function keyword invalid within a function body");
  2518.  
  2519.       if ((reading_fcn_file || reading_script_file)
  2520.           && curr_fcn_file_name)
  2521.         error ("defining new function near line %d of file `%s.m'",
  2522.            input_line_number, curr_fcn_file_name);
  2523.       else
  2524.         error ("defining new function near line %d", input_line_number);
  2525.  
  2526.       return LEXICAL_ERROR;
  2527.     }
  2528.       else
  2529.     {
  2530.       tmp_local_sym_tab = new symbol_table ();
  2531.       curr_sym_tab = tmp_local_sym_tab;
  2532.       defining_func = 1;
  2533.       promptflag--;
  2534.       beginning_of_function = 1;
  2535.       if (! (reading_fcn_file || reading_script_file))
  2536.         input_line_number = 1;
  2537.       return FCN;
  2538.     }
  2539.     }
  2540.   else if (strcmp ("global", s) == 0)
  2541.     {
  2542.       yylval.tok_val = new token (l, c);
  2543.       token_stack.push (yylval.tok_val);
  2544.       return GLOBAL;
  2545.     }
  2546.   else if (strcmp ("gplot", s) == 0)
  2547.     {
  2548.       plotting = 1;
  2549.       yylval.tok_val = new token (token::two_dee, l, c);
  2550.       token_stack.push (yylval.tok_val);
  2551.       return PLOT;
  2552.     }
  2553.   else if (strcmp ("gsplot", s) == 0)
  2554.     {
  2555.       plotting = 1;
  2556.       yylval.tok_val = new token (token::three_dee, l, c);
  2557.       token_stack.push (yylval.tok_val);
  2558.       return PLOT;
  2559.     }
  2560.   else if (strcmp ("replot", s) == 0)
  2561.     {
  2562.       plotting = 1;
  2563.       yylval.tok_val = new token (token::replot, l, c);
  2564.       token_stack.push (yylval.tok_val);
  2565.       return PLOT;
  2566.     }
  2567.   else if (strcmp ("if", s) == 0)
  2568.     {
  2569.       iffing++;
  2570.       promptflag--;
  2571.       yylval.tok_val = new token (l, c);
  2572.       token_stack.push (yylval.tok_val);
  2573.       return IF;
  2574.     }
  2575.   else if (strcmp ("return", s) == 0)
  2576.     {
  2577.       yylval.tok_val = new token (l, c);
  2578.       token_stack.push (yylval.tok_val);
  2579.       return FUNC_RET;
  2580.     }
  2581.   else if (strcmp ("while", s) == 0)
  2582.     {
  2583.       promptflag--;
  2584.       looping++;
  2585.       yylval.tok_val = new token (l, c);
  2586.       token_stack.push (yylval.tok_val);
  2587.       return WHILE;
  2588.     }
  2589.   else if (strcmp ("unwind_protect", s) == 0)
  2590.     {
  2591.       promptflag--;
  2592.       yylval.tok_val = new token (l, c);
  2593.       token_stack.push (yylval.tok_val);
  2594.       return UNWIND;
  2595.     }
  2596.   else if (strcmp ("unwind_protect_cleanup", s) == 0)
  2597.     {
  2598.       yylval.tok_val = new token (l, c);
  2599.       token_stack.push (yylval.tok_val);
  2600.       return CLEANUP;
  2601.     }
  2602.   else if (strcmp ("end_unwind_protect", s) == 0)
  2603.     {
  2604.       end_found = 1;
  2605.       yylval.tok_val = new token (token::unwind_protect_end, l, c);
  2606.       token_stack.push (yylval.tok_val);
  2607.     }
  2608.   else if (strcmp ("all_va_args", s) == 0)
  2609.     {
  2610.       yylval.tok_val = new token (l, c);
  2611.       token_stack.push (yylval.tok_val);
  2612.       return ALL_VA_ARGS;
  2613.     }
  2614.  
  2615.   if (end_found)
  2616.     return END;
  2617.  
  2618.   return 0;
  2619. }
  2620.  
  2621. // Try to find an identifier.  All binding to global or builtin
  2622. // variables occurs when expressions are evaluated.
  2623.  
  2624. static symbol_record *
  2625. lookup_identifier (char *name)
  2626. {
  2627.   return curr_sym_tab->lookup (name, 1, 0);
  2628. }
  2629.  
  2630. // Grab the help text from an function file.  Always overwrites the
  2631. // current contents of help_buf.
  2632.  
  2633. static void
  2634. grab_help_text (void)
  2635. {
  2636.   delete [] help_buf;
  2637.   help_buf = 0;
  2638.  
  2639.   ostrstream buf;
  2640.  
  2641.   int in_comment = 1;
  2642.   int c = 0;
  2643.  
  2644.   while ((c = yyinput ()) != EOF)
  2645.     {
  2646.       if (in_comment)
  2647.     {
  2648.       buf << (char) c;
  2649.       if (c == '\n')
  2650.         in_comment = 0;
  2651.     }
  2652.       else
  2653.     {
  2654.       switch (c)
  2655.         {
  2656.         case '%':
  2657.         case '#':
  2658.           in_comment = 1;
  2659.           break;
  2660.  
  2661.         case ' ':
  2662.         case '\t':
  2663.           break;
  2664.  
  2665.         default:
  2666.           goto done;
  2667.         }
  2668.     }
  2669.     }
  2670.  
  2671.  done:
  2672.  
  2673.   if (c)
  2674.     yyunput (c, yytext);
  2675.  
  2676.   buf << ends;
  2677.  
  2678.   help_buf = buf.str ();
  2679.  
  2680.   if (! help_buf || ! *help_buf)
  2681.     {
  2682.       delete [] help_buf;
  2683.       help_buf = 0;
  2684.     }
  2685. }
  2686.  
  2687. // Return 1 if the given character matches any character in the given
  2688. // string.
  2689.  
  2690. static int
  2691. match_any (char c, char *s)
  2692. {
  2693.   char tmp;
  2694.   while ((tmp = *s++) != '\0')
  2695.     {
  2696.       if (c == tmp)
  2697.     return 1;
  2698.     }
  2699.   return 0;
  2700. }
  2701.  
  2702. // Given information about the spacing surrounding an operator,
  2703. // return 1 if it looks like it should be treated as a binary
  2704. // operator.  For example,
  2705. //
  2706. //   [ 1 + 2 ]  or  [ 1+ 2]  or  [ 1+2 ]  ==> binary
  2707.  
  2708. static int
  2709. looks_like_bin_op (int spc_prev, int spc_next)
  2710. {
  2711.   return ((spc_prev && spc_next) || ! spc_prev);
  2712. }
  2713.  
  2714. // Duh.
  2715.  
  2716. static int
  2717. next_char_is_space (void)
  2718. {
  2719.   int c = yyinput ();
  2720.   yyunput (c, yytext);
  2721.   return (c == ' ' || c == '\t');
  2722. }
  2723.  
  2724. // Try to determine if the next token should be treated as a postfix
  2725. // unary operator.  This is ugly, but it seems to do the right thing.
  2726.  
  2727. static int
  2728. next_token_is_postfix_unary_op (int spc_prev, char *yytext)
  2729. {
  2730.   int un_op = 0;
  2731.  
  2732.   int c0 = yyinput ();
  2733.   int c1 = yyinput ();
  2734.  
  2735.   yyunput (c1, yytext);
  2736.   yyunput (c0, yytext);
  2737.  
  2738.   int transpose = (c0 == '.' && c1 == '\'');
  2739.   int hermitian = (c0 == '\'');
  2740.  
  2741.   un_op = (transpose || (hermitian && ! spc_prev));
  2742.  
  2743.   return un_op;
  2744. }
  2745.  
  2746. // Try to determine if the next token should be treated as a binary
  2747. // operator.  This is even uglier, but it also seems to do the right
  2748. // thing.
  2749.  
  2750. static int
  2751. next_token_is_bin_op (int spc_prev, char *yytext)
  2752. {
  2753.   int bin_op = 0;
  2754.   int spc_next = 0;
  2755.  
  2756.   int c0 = yyinput ();
  2757.   int c1 = yyinput ();
  2758.  
  2759.   switch (c0)
  2760.     {
  2761.     case '+':
  2762.     case '-':
  2763.     case '/':
  2764.     case ':':
  2765.     case '\\':
  2766.     case '^':
  2767.       spc_next = (c1 == ' ' || c1 == '\t');
  2768.       break;
  2769.  
  2770.     case '&':
  2771.       if (c1 == '&')
  2772.     spc_next = next_char_is_space ();
  2773.       else
  2774.     spc_next = (c1 == ' ' || c1 == '\t');
  2775.       break;
  2776.  
  2777.     case '*':
  2778.       if (c1 == '*')
  2779.     spc_next = next_char_is_space ();
  2780.       else
  2781.     spc_next = (c1 == ' ' || c1 == '\t');
  2782.       break;
  2783.     
  2784.     case '|':
  2785.       if (c1 == '|')
  2786.     spc_next = next_char_is_space ();
  2787.       else
  2788.     spc_next = (c1 == ' ' || c1 == '\t');
  2789.       break;
  2790.  
  2791.     case '<':
  2792.       if (c1 == '=' || c1 == '>')
  2793.     spc_next = next_char_is_space ();
  2794.       else
  2795.     spc_next = (c1 == ' ' || c1 == '\t');
  2796.       break;
  2797.  
  2798.     case '>':
  2799.       if (c1 == '=')
  2800.     spc_next = next_char_is_space ();
  2801.       else
  2802.     spc_next = (c1 == ' ' || c1 == '\t');
  2803.       break;
  2804.  
  2805.     case '~':
  2806.     case '!':
  2807.     case '=':
  2808.       if (c1 == '=')
  2809.     spc_next = next_char_is_space ();
  2810.       else
  2811.     goto done;
  2812.       break;
  2813.  
  2814.     case '.':
  2815.       if (c1 == '*')
  2816.     {
  2817.       int c2 = yyinput ();
  2818.       if (c2 == '*')
  2819.         spc_next = next_char_is_space ();
  2820.       else
  2821.         spc_next = (c2 == ' ' || c2 == '\t');
  2822.       yyunput (c2, yytext);
  2823.     }
  2824.       else if (c1 == '/' || c1 == '\\' || c1 == '^')
  2825.     spc_next = next_char_is_space ();
  2826.       else
  2827.     goto done;
  2828.       break;
  2829.  
  2830.     default:
  2831.       goto done;
  2832.     }
  2833.  
  2834.   bin_op = looks_like_bin_op (spc_prev, spc_next);
  2835.  
  2836.  done:
  2837.   yyunput (c1, yytext);
  2838.   yyunput (c0, yytext);
  2839.  
  2840.   return bin_op;
  2841. }
  2842.  
  2843. // Used to delete trailing white space from tokens.
  2844.  
  2845. static char *
  2846. strip_trailing_whitespace (char *s)
  2847. {
  2848.   char *retval = strsave (s);
  2849.  
  2850.   char *t = strchr (retval, ' ');
  2851.   if (t)
  2852.     *t = '\0';
  2853.  
  2854.   t = strchr (retval, '\t');
  2855.   if (t)
  2856.     *t = '\0';
  2857.  
  2858.   return retval;
  2859. }
  2860.  
  2861. // Discard whitespace, including comments and continuations.
  2862. //
  2863. // Return value is logical OR of the following values:
  2864. //
  2865. //  ATE_SPACE_OR_TAB : space or tab in input
  2866. //  ATE_NEWLINE      : bare new line in input
  2867.  
  2868. static int
  2869. eat_whitespace (void)
  2870. {
  2871.   int retval = 0;
  2872.   int in_comment = 0;
  2873.   int c;
  2874.   while ((c = yyinput ()) != EOF)
  2875.     {
  2876.       current_input_column++;
  2877.  
  2878.       switch (c)
  2879.     {
  2880.     case ' ':
  2881.     case '\t':
  2882.       retval |= ATE_SPACE_OR_TAB;
  2883.       break;
  2884.  
  2885.     case '\n':
  2886.       retval |= ATE_NEWLINE;
  2887.       in_comment = 0;
  2888.       current_input_column = 0;
  2889.       break;
  2890.  
  2891.     case '#':
  2892.     case '%':
  2893.       in_comment = 1;
  2894.       break;
  2895.  
  2896.     case '.':
  2897.       if (in_comment)
  2898.         break;
  2899.       else
  2900.         {
  2901.           if (have_ellipsis_continuation ())
  2902.         break;
  2903.           else
  2904.         goto done;
  2905.         }
  2906.  
  2907.     case '\\':
  2908.       if (in_comment)
  2909.         break;
  2910.       else
  2911.         {
  2912.           if (have_continuation ())
  2913.         break;
  2914.           else
  2915.         goto done;
  2916.         }
  2917.  
  2918.     default:
  2919.       if (in_comment)
  2920.         break;
  2921.       else
  2922.         goto done;
  2923.     }
  2924.     }
  2925.  
  2926.  done:
  2927.   yyunput (c, yytext);
  2928.   current_input_column--;
  2929.   return retval;
  2930. }
  2931.  
  2932. static void
  2933. handle_number (char *yytext)
  2934. {
  2935.   double value;
  2936.   int nread = sscanf (yytext, "%lf", &value);
  2937.  
  2938. // If yytext doesn't contain a valid number, we are in deep doo doo.
  2939.  
  2940.   assert (nread == 1);
  2941.  
  2942.   quote_is_transpose = 1;
  2943.   cant_be_identifier = 1;
  2944.   convert_spaces_to_comma = 1;
  2945.  
  2946.   if (plotting && ! in_plot_range)
  2947.     past_plot_range = 1;
  2948.  
  2949.   yylval.tok_val = new token (value, yytext, input_line_number,
  2950.                   current_input_column);
  2951.  
  2952.   token_stack.push (yylval.tok_val);
  2953.  
  2954.   current_input_column += yyleng;
  2955.  
  2956.   do_comma_insert_check ();
  2957. }
  2958.  
  2959. // We have seen a backslash and need to find out if it should be
  2960. // treated as a continuation character.  If so, this eats it, up to
  2961. // and including the new line character.
  2962. //
  2963. // Match whitespace only, followed by a comment character or newline.
  2964. // Once a comment character is found, discard all input until newline.
  2965. // If non-whitespace characters are found before comment
  2966. // characters, return 0.  Otherwise, return 1.
  2967.  
  2968. static int
  2969. have_continuation (int trailing_comments_ok)
  2970. {
  2971.   ostrstream buf;
  2972.  
  2973.   int in_comment = 0;
  2974.   char c;
  2975.   while ((c = yyinput ()) != EOF)
  2976.     {
  2977.       buf << (char) c;
  2978.  
  2979.       switch (c)
  2980.     {
  2981.     case ' ':
  2982.     case '\t':
  2983.       break;
  2984.  
  2985.     case '%':
  2986.     case '#':
  2987.       if (trailing_comments_ok)
  2988.         in_comment = 1;
  2989.       else
  2990.         goto cleanup;
  2991.       break;
  2992.  
  2993.     case '\n':
  2994.       current_input_column = 0;
  2995.       promptflag--;
  2996.       return 1;
  2997.  
  2998.     default:
  2999.       if (! in_comment)
  3000.         goto cleanup;
  3001.       break;
  3002.     }
  3003.     }
  3004.  
  3005.   yyunput (c, yytext);
  3006.   return 0;
  3007.  
  3008.  cleanup:
  3009.   buf << ends;
  3010.   char *s = buf.str ();
  3011.   if (s)
  3012.     {
  3013.       int len = strlen (s);
  3014.       while (len--)
  3015.     yyunput (s[len], yytext);
  3016.     }
  3017.   delete [] s;
  3018.   return 0;
  3019. }
  3020.  
  3021. // We have seen a `.' and need to see if it is the start of a
  3022. // continuation.  If so, this eats it, up to and including the new
  3023. // line character.
  3024.  
  3025. static int
  3026. have_ellipsis_continuation (int trailing_comments_ok)
  3027. {
  3028.   char c1 = yyinput ();
  3029.   if (c1 == '.')
  3030.     {
  3031.       char c2 = yyinput ();
  3032.       if (c2 == '.' && have_continuation (trailing_comments_ok))
  3033.     return 1;
  3034.       else
  3035.     {
  3036.       yyunput (c2, yytext);
  3037.       yyunput (c1, yytext);
  3038.     }
  3039.     }
  3040.   else
  3041.     yyunput (c1, yytext);
  3042.  
  3043.   return 0;
  3044. }
  3045.  
  3046. // See if we have a continuation line.  If so, eat it and the leading
  3047. // whitespace on the next line.
  3048. //
  3049. // Return value is the same as described for eat_whitespace().
  3050.  
  3051. static int
  3052. eat_continuation (void)
  3053. {
  3054.   int retval = 0;
  3055.   int c = yyinput ();
  3056.   if ((c == '.' && have_ellipsis_continuation ())
  3057.       || (c == '\\' && have_continuation ()))
  3058.     retval = eat_whitespace ();
  3059.   else
  3060.     yyunput (c, yytext);
  3061.  
  3062.   return retval;
  3063. }
  3064.  
  3065. static int
  3066. handle_string (char delim, int text_style)
  3067. {
  3068.   ostrstream buf;
  3069.  
  3070.   int c;
  3071.   int escape_pending = 0;
  3072.  
  3073.   while ((c = yyinput ()) != EOF)
  3074.     {
  3075.       current_input_column++;
  3076.  
  3077.       if (c == '\\')
  3078.     {
  3079.       if (escape_pending)
  3080.         {
  3081.           buf << (char) c;
  3082.           escape_pending = 0;
  3083.         }
  3084.       else
  3085.         {
  3086.           if (have_continuation (0))
  3087.         escape_pending = 0;
  3088.           else
  3089.         {
  3090.           buf << (char) c;
  3091.           escape_pending = 1;
  3092.         }
  3093.         }
  3094.       continue;
  3095.     }
  3096.       else if (c == '.')
  3097.     {
  3098.       if (! have_ellipsis_continuation (0))
  3099.         buf << (char) c;
  3100.     }
  3101.       else if (c == '\n')
  3102.     {
  3103.       error ("unterminated string constant");
  3104.       break;
  3105.     }
  3106.       else if (c == delim)
  3107.     {
  3108.       if (escape_pending)
  3109.         buf << (char) c;
  3110.       else
  3111.         {
  3112.           c = yyinput ();
  3113.           if (c == delim)
  3114.         buf << (char) c;
  3115.           else
  3116.         {
  3117.           yyunput (c, yytext);
  3118.           buf << ends;
  3119.           char *tok = buf.str ();
  3120.           do_string_escapes (tok);
  3121.  
  3122.           if (text_style && doing_set)
  3123.             {
  3124.               if (tok)
  3125.             {
  3126.               int len = strlen (tok) + 3;
  3127.               char *tmp = tok;
  3128.               tok = new char [len];
  3129.               tok[0] = delim;
  3130.               strcpy (tok+1, tmp);
  3131.               tok[len-2] = delim;
  3132.               tok[len-1] = '\0';
  3133.               delete [] tmp;
  3134.             }
  3135.             }
  3136.           else
  3137.             {
  3138.               quote_is_transpose = 1;
  3139.               cant_be_identifier = 1;
  3140.               convert_spaces_to_comma = 1;
  3141.             }
  3142.  
  3143.           yylval.tok_val = new token (tok);
  3144.           delete [] tok;
  3145.           token_stack.push (yylval.tok_val);
  3146.           return TEXT;
  3147.         }
  3148.         }
  3149.     }
  3150.       else
  3151.     {
  3152.       buf << (char) c;
  3153.     }
  3154.  
  3155.       escape_pending = 0;
  3156.     }
  3157.  
  3158.   return LEXICAL_ERROR;
  3159. }
  3160.  
  3161. static int
  3162. handle_close_brace (int spc_gobbled)
  3163. {
  3164.   if (! nesting_level.empty ())
  3165.     {
  3166.       nesting_level.pop ();
  3167.       braceflag--;
  3168.     }
  3169.  
  3170.   if (braceflag == 0)
  3171.     BEGIN 0;
  3172.  
  3173.   int c1 = yyinput ();
  3174.   if (c1 == '=')
  3175.     {
  3176.       quote_is_transpose = 0;
  3177.       cant_be_identifier = 0;
  3178.       convert_spaces_to_comma = 1;
  3179.  
  3180.       int c2 = yyinput ();
  3181.       unput (c2);
  3182.       unput (c1);
  3183.  
  3184.       if (c2 != '=' && maybe_screwed_again)
  3185.     return SCREW_TWO;
  3186.       else
  3187.     return ']';
  3188.     }
  3189.   else
  3190.     {
  3191.       unput (c1);
  3192.  
  3193.       if (braceflag && user_pref.whitespace_in_literal_matrix != 2)
  3194.     {
  3195.       int bin_op = next_token_is_bin_op (spc_gobbled, yytext);
  3196.       int postfix_un_op = next_token_is_postfix_unary_op
  3197.         (spc_gobbled, yytext);
  3198.  
  3199.       int other_op = match_any (c1, ",;\n]");
  3200.  
  3201.       if (! (postfix_un_op || bin_op || other_op
  3202.          || nesting_level.empty ())
  3203.           && nesting_level.top () == BRACE
  3204.           && convert_spaces_to_comma)
  3205.         {
  3206.           unput (',');
  3207.           return ']';
  3208.         }
  3209.     }
  3210.     }
  3211.  
  3212.   quote_is_transpose = 1;
  3213.   cant_be_identifier = 0;
  3214.   convert_spaces_to_comma = 1;
  3215.   return ']';
  3216. }
  3217.  
  3218. static void
  3219. maybe_unput_comma (int spc_gobbled)
  3220. {
  3221.   if (user_pref.whitespace_in_literal_matrix != 2
  3222.       && ! nesting_level.empty ()
  3223.       && nesting_level.top () == BRACE) 
  3224.     {
  3225.       int bin_op = next_token_is_bin_op (spc_gobbled, yytext);
  3226.  
  3227.       int postfix_un_op = next_token_is_postfix_unary_op (spc_gobbled,
  3228.                               yytext);
  3229.  
  3230.       int c1 = yyinput ();
  3231.       int c2 = yyinput ();
  3232.       unput (c2);
  3233.       unput (c1);
  3234.       int sep_op = match_any (c1, ",;\n]");
  3235.       int dot_op = (c1 == '.'
  3236.             && (isalpha (c2) || isspace (c2) || c2 == '_'));
  3237.       int index_op = (c1 == '('
  3238.               && (user_pref.whitespace_in_literal_matrix == 0
  3239.               || ! spc_gobbled));
  3240.  
  3241.       if (! (postfix_un_op || bin_op || sep_op || dot_op || index_op))
  3242.     unput (',');
  3243.     }
  3244. }
  3245.  
  3246. // Figure out exactly what kind of token to return when we have seen
  3247. // an identifier.  Handles keywords.
  3248.  
  3249. static int
  3250. handle_identifier (char *tok, int spc_gobbled)
  3251. {
  3252. // It is almost always an error for an identifier to be followed
  3253. // directly by another identifier.  Special cases are handled below.
  3254.  
  3255.   cant_be_identifier = 1;
  3256.  
  3257. // If we are expecting a structure element, we just want to return
  3258. // TEXT_ID, which is a string that is also a valid identifier.  But
  3259. // first, we have to decide whether to insert a comma.
  3260.  
  3261.   if (looking_at_indirect_ref)
  3262.     {
  3263.       maybe_unput_comma (spc_gobbled);
  3264.       TOK_PUSH_AND_RETURN (tok, TEXT_ID);
  3265.     }
  3266.  
  3267. // If we have a regular keyword, or a plot STYLE, return it.  Keywords
  3268. // can be followed by identifiers (TOK_RETURN handles that).
  3269.  
  3270.   int kw_token = is_keyword (tok);
  3271.   if (kw_token)
  3272.     {
  3273.       if (kw_token == STYLE)
  3274.     {
  3275.       current_input_column += yyleng;
  3276.       quote_is_transpose = 0;
  3277.       convert_spaces_to_comma = 1;
  3278.       return kw_token;
  3279.     }
  3280.       else
  3281.     TOK_RETURN (kw_token);
  3282.     }
  3283.  
  3284. // See if we have a plot keyword (title, using, with, or clear).
  3285.  
  3286.   if (plotting)
  3287.     {
  3288. // Yes, we really do need both of these plot_range variables.  One
  3289. // is used to mark when we are past all possiblity of a plot range,
  3290. // the other is used to mark when we are actually between the square
  3291. // brackets that surround the range.
  3292.  
  3293.       if (! in_plot_range)
  3294.     past_plot_range = 1;
  3295.  
  3296.       int plot_option_kw = is_plot_keyword (tok);
  3297.  
  3298.       if (cant_be_identifier && plot_option_kw)
  3299.     TOK_RETURN (plot_option_kw);
  3300.     }
  3301.  
  3302. // If we are looking at a text style function, set up to gobble its
  3303. // arguments.  These are also reserved words, but only because it
  3304. // would be very difficult to do anything intelligent with them if
  3305. // they were not reserved.
  3306.  
  3307.   if (is_text_function_name (tok))
  3308.     {
  3309.       BEGIN TEXT_FCN;
  3310.  
  3311.       if (strcmp (tok, "help") == 0)
  3312.     BEGIN HELP_FCN;
  3313.       else if (strcmp (tok, "set") == 0)
  3314.     doing_set = 1;
  3315.     }
  3316.  
  3317.   int c = yyinput ();
  3318.   yyunput (c, yytext);
  3319.   int next_tok_is_eq = (c == '=');
  3320.  
  3321. // Make sure we put the return values of a function in the symbol
  3322. // table that is local to the function.
  3323.  
  3324.   if (next_tok_is_eq && defining_func && maybe_screwed)
  3325.     curr_sym_tab = tmp_local_sym_tab;
  3326.  
  3327. // Find the token in the symbol table.
  3328.  
  3329.   yylval.tok_val = new token (lookup_identifier (tok),
  3330.                   input_line_number,
  3331.                   current_input_column);
  3332.  
  3333.   token_stack.push (yylval.tok_val);
  3334.  
  3335. // After seeing an identifer, it is ok to convert spaces to a comma
  3336. // (if needed).
  3337.  
  3338.   convert_spaces_to_comma = 1;
  3339.  
  3340. // If we are defining a function and we have not seen the parameter
  3341. // list yet and the next token is `=', return a token that represents
  3342. // the only return value for the function.  For example,
  3343. //
  3344. //   function SCREW = f (args);
  3345. //
  3346. // The variable maybe_screwed is reset in parse.y.
  3347.  
  3348.   if (next_tok_is_eq)
  3349.     {
  3350.       current_input_column += yyleng;
  3351.       if (defining_func && maybe_screwed)
  3352.     return SCREW;
  3353.       else
  3354.     return NAME;
  3355.     }
  3356.  
  3357. // At this point, we are only dealing with identifiers that are not
  3358. // followed by `=' (if the next token is `=', there is no need to
  3359. // check to see if we should insert a comma (invalid syntax), or allow
  3360. // a following `'' to be treated as a transpose (the next token is
  3361. // `=', so it can't be `''.
  3362.  
  3363.   quote_is_transpose = 1;
  3364.   do_comma_insert_check ();
  3365.  
  3366.   maybe_unput_comma (spc_gobbled);
  3367.  
  3368.   current_input_column += yyleng;
  3369.   return NAME;
  3370. }
  3371.  
  3372. // Print a warning if a function file that defines a function has
  3373. // anything other than comments and whitespace following the END token
  3374. // that matches the FUNCTION statement.
  3375.  
  3376. void
  3377. check_for_garbage_after_fcn_def (void)
  3378. {
  3379. // By making a newline be the next character to be read, we will force
  3380. // the parser to return after reading the function.  Calling yyunput
  3381. // with EOF seems not to work...
  3382.  
  3383.   int in_comment = 0;
  3384.   int lineno = input_line_number;
  3385.   int c;
  3386.   while ((c = yyinput ()) != EOF)
  3387.     {
  3388.       switch (c)
  3389.     {
  3390.     case ' ':
  3391.     case '\t':
  3392.     case ';':
  3393.     case ',':
  3394.       break;
  3395.  
  3396.     case '\n':
  3397.       if (in_comment)
  3398.         in_comment = 0;
  3399.       break;
  3400.  
  3401.     case '%':
  3402.     case '#':
  3403.       in_comment = 1;
  3404.       break;
  3405.  
  3406.     default:
  3407.       if (in_comment)
  3408.         break;
  3409.       else
  3410.         {
  3411.           warning ("ignoring trailing garbage after end of function\n\
  3412.          near line %d of file `%s.m'", lineno, curr_fcn_file_name);
  3413.           
  3414.           yyunput ('\n', yytext);
  3415.           return;
  3416.         }
  3417.     }
  3418.     }
  3419.   yyunput ('\n', yytext);
  3420. }
  3421.  
  3422. /*
  3423.  
  3424. Maybe someday...
  3425.  
  3426. "+="        return ADD_EQ;
  3427. "-="        return SUB_EQ;
  3428. "*="        return MUL_EQ;
  3429. "/="        return DIV_EQ;
  3430. "\\="        return LEFTDIV_EQ;
  3431. ".+="        return ADD_EQ;
  3432. ".-="        return SUB_EQ;
  3433. ".*="        return EMUL_EQ;
  3434. "./="        return EDIV_EQ;
  3435. ".\\="        return ELEFTDIV_EQ;
  3436.  
  3437. */
  3438.