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 / tree-expr.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  18KB  |  911 lines

  1. // tree-expr.h                                      -*- C++ -*-
  2. /*
  3.  
  4. Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton
  5.  
  6. This file is part of Octave.
  7.  
  8. Octave is free software; you can redistribute it and/or modify it
  9. under the terms of the GNU General Public License as published by the
  10. Free Software Foundation; either version 2, or (at your option) any
  11. later version.
  12.  
  13. Octave is distributed in the hope that it will be useful, but WITHOUT
  14. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with Octave; see the file COPYING.  If not, write to the Free
  20. Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. */
  23.  
  24. #if !defined (octave_tree_expr_h)
  25. #define octave_tree_expr_h 1
  26.  
  27. #include <time.h>
  28. #include <stdio.h>
  29. #include <iostream.h>
  30.  
  31. #include "SLList.h"
  32.  
  33. #include "variables.h"
  34. #include "mappers.h"
  35. #include "error.h"
  36. #include "oct-obj.h"
  37.  
  38. class tree_constant;
  39. class tree_statement_list;
  40. class tree_argument_list;
  41. class tree_parameter_list;
  42. class tree_return_list;
  43. class tree_va_return_list;
  44. class symbol_record;
  45. class symbol_table;
  46.  
  47. class tree_matrix;
  48. class tree_builtin;
  49. class tree_identifier;
  50. class tree_indirect_ref;
  51. class tree_function;
  52. class tree_expression;
  53. class tree_prefix_expression;
  54. class tree_postfix_expression;
  55. class tree_unary_expression;
  56. class tree_binary_expression;
  57. class tree_assignment_expression;
  58. class tree_simple_assignment_expression;
  59. class tree_multi_assignment_expression;
  60. class tree_colon_expression;
  61. class tree_index_expression;
  62.  
  63. #include "tree-base.h"
  64.  
  65. // A base class for expressions.
  66.  
  67. class
  68. tree_expression : public tree
  69. {
  70. public:
  71.   int in_parens;
  72.  
  73.   enum type
  74.     {
  75.       unknown,
  76.       assignment,
  77.       simple_assignment,
  78.       multi_assignment,
  79.       add,
  80.       subtract,
  81.       multiply,
  82.       el_mul,
  83.       divide,
  84.       el_div,
  85.       leftdiv,
  86.       el_leftdiv,
  87.       power,
  88.       elem_pow,
  89.       cmp_lt,
  90.       cmp_le,
  91.       cmp_eq,
  92.       cmp_ge,
  93.       cmp_gt,
  94.       cmp_ne,
  95.       and_and,
  96.       or_or,
  97.       and,
  98.       or,
  99.       not,
  100.       unot,
  101.       uminus,
  102.       hermitian,
  103.       transpose,
  104.       colon,
  105.       index,
  106.       increment,
  107.       decrement,
  108.    };
  109.  
  110.   tree_expression (int l = -1, int c = -1) : tree (l, c)
  111.     {
  112.       in_parens = 0;
  113.       etype = unknown;
  114.     }
  115.  
  116.   virtual ~tree_expression (void) { }
  117.  
  118.   virtual int is_multi_val_ret_expression (void) const
  119.     { return 0; }
  120.  
  121.   virtual int is_identifier (void) const
  122.     { return 0; }
  123.  
  124.   virtual int is_indirect_ref (void) const
  125.     { return 0; }
  126.  
  127.   virtual int is_index_expression (void) const
  128.     { return 0; }
  129.  
  130.   virtual int is_assignment_expression (void) const
  131.     { return 0; }
  132.  
  133.   virtual int is_prefix_expression (void) const
  134.     { return 0; }
  135.  
  136.   virtual void mark_for_possible_ans_assign (void)
  137.     { panic_impossible (); }
  138.  
  139.   virtual tree_constant eval (int print) = 0;
  140.  
  141. protected:
  142.   type etype;
  143. };
  144.  
  145. // General matrices.  This allows us to construct matrices from
  146. // other matrices, variables, and functions.
  147.  
  148. class
  149. tree_matrix : public tree_expression
  150. {
  151. public:
  152.   enum dir
  153.     {
  154.       md_none,
  155.       md_right,
  156.       md_down,
  157.     };
  158.  
  159.   tree_matrix (void)
  160.     {
  161.       direction = tree_matrix::md_none;
  162.       element = 0;
  163.       next = 0;
  164.     }
  165.  
  166.   tree_matrix (tree_expression *e, tree_matrix::dir d)
  167.     {
  168.       direction = d;
  169.       element = e;
  170.       next = 0;
  171.     }
  172.  
  173.   ~tree_matrix (void);
  174.  
  175.   tree_matrix *chain (tree_expression *e, tree_matrix::dir d);
  176.   tree_matrix *reverse (void);
  177.   int length (void);
  178.  
  179.   tree_return_list *to_return_list (void);
  180.  
  181.   tree_constant eval (int print);
  182.  
  183.   void print_code (ostream& os);
  184.  
  185. private:
  186.   tree_matrix::dir direction; // Direction from the previous element.
  187.   tree_expression *element;
  188.   tree_matrix *next;
  189. };
  190.  
  191. // A base class for objects that can be return multiple values
  192.  
  193. class
  194. tree_multi_val_ret : public tree_expression
  195. {
  196. public:
  197.   tree_multi_val_ret (int l = -1, int c = -1) : tree_expression (l, c) { }
  198.  
  199.   int is_multi_val_ret_expression (void) const
  200.     { return 1; }
  201.  
  202.   tree_constant eval (int print);
  203.  
  204.   virtual Octave_object eval (int print, int nargout,
  205.                   const Octave_object& args) = 0;
  206. };
  207.  
  208. // A base class for objects that can be evaluated with argument lists.
  209.  
  210. class
  211. tree_fvc : public tree_multi_val_ret
  212. {
  213. public:
  214.   tree_fvc (int l = -1, int c = -1) : tree_multi_val_ret (l, c) { }
  215.  
  216.   virtual int is_constant (void) const
  217.     { return 0; }
  218.  
  219.   virtual tree_constant assign (tree_constant& t,
  220.                 const Octave_object& args);
  221.  
  222.   virtual char *name (void) const
  223.     { panic_impossible (); return 0; }
  224.  
  225.   virtual void bump_value (tree_expression::type)
  226.     { panic_impossible (); }
  227.  
  228.   virtual tree_constant lookup_map_element (SLList<char*>& list);
  229.  
  230.   virtual int max_expected_args (void)
  231.     { panic_impossible (); return 0; }
  232.   
  233.   virtual char *fcn_file_name (void)
  234.     { return 0; }
  235.  
  236.   virtual time_t time_parsed (void)
  237.     { panic_impossible (); return 0; }
  238.  
  239.   virtual int is_system_fcn_file (void) const
  240.     { return 0; }
  241.  
  242.   virtual int save (ostream& os, int mark_as_global = 0,
  243.             int precision = 17)
  244.     { panic_impossible (); return 0; }
  245. };
  246.  
  247. // Symbols from the symbol table.
  248.  
  249. class
  250. tree_identifier : public tree_fvc
  251. {
  252.   friend class tree_index_expression;
  253.  
  254. public:
  255.   tree_identifier (int l = -1, int c = -1) : tree_fvc (l, c)
  256.     {
  257.       sym = 0;
  258.       maybe_do_ans_assign = 0;
  259.     }
  260.  
  261.   tree_identifier (symbol_record *s, int l = -1, int c = -1) : tree_fvc (l, c)
  262.     {
  263.       sym = s;
  264.       maybe_do_ans_assign = 0;
  265.     }
  266.  
  267.   int is_identifier (void) const
  268.     { return 1; }
  269.  
  270.   char *name (void) const;
  271.  
  272.   tree_identifier *define (tree_constant *t);
  273.   tree_identifier *define (tree_function *t);
  274.  
  275.   void document (char *s);
  276.  
  277.   tree_constant assign (tree_constant& t);
  278.   tree_constant assign (tree_constant& t, const Octave_object& args);
  279.  
  280.   tree_constant assign (SLList<char*> list, tree_constant& t);
  281.   tree_constant assign (SLList<char*> list, tree_constant& t,
  282.             const Octave_object& args); 
  283.  
  284.   int is_defined (void);
  285.  
  286.   void bump_value (tree_expression::type);
  287.  
  288.   tree_fvc *do_lookup (int& script_file_executed, int exec_script = 1);
  289.  
  290.   void link_to_global (void);
  291.  
  292.   void mark_as_formal_parameter (void);
  293.  
  294.   void mark_for_possible_ans_assign (void)
  295.     { maybe_do_ans_assign = 1; }
  296.  
  297.   tree_constant eval (int print);
  298.  
  299.   Octave_object eval (int print, int nargout, const Octave_object& args);
  300.  
  301.   void eval_undefined_error (void);
  302.  
  303.   void print_code (ostream& os);
  304.  
  305. private:
  306.   symbol_record *sym;
  307.   int maybe_do_ans_assign;
  308. };
  309.  
  310. // Indirect references to values (structure references).
  311.  
  312. class
  313. tree_indirect_ref : public tree_fvc
  314. {
  315. public:
  316.   tree_indirect_ref (int l = -1, int c = -1) : tree_fvc (l, c)
  317.     {
  318.       id = 0;
  319.       preserve_ident = 0;
  320.     }
  321.  
  322.   tree_indirect_ref (tree_identifier *i, int l = -1, int c = -1)
  323.     : tree_fvc (l, c)
  324.       {
  325.     id = i;
  326.     preserve_ident = 0;
  327.       }
  328.  
  329.   ~tree_indirect_ref (void);
  330.  
  331.   tree_indirect_ref *chain (const char *s);
  332.  
  333.   int is_indirect_ref (void) const
  334.     { return 1; }
  335.  
  336.   int is_identifier_only (void) const
  337.     { return (id && refs.empty ()); }
  338.  
  339.   tree_identifier *ident (void)
  340.     { return id; }
  341.  
  342.   void preserve_identifier (void)
  343.     { preserve_ident = 1; }
  344.  
  345.   char *name (void);
  346.  
  347.   tree_constant assign (tree_constant& t);
  348.   tree_constant assign (tree_constant& t, const Octave_object& args);
  349.  
  350.   void mark_for_possible_ans_assign (void)
  351.     { id->mark_for_possible_ans_assign (); }
  352.  
  353.   tree_constant eval (int print);
  354.  
  355.   Octave_object eval (int print, int nargout, const Octave_object& args);
  356.  
  357.   void print_code (ostream& os);
  358.  
  359. private:
  360.   tree_identifier *id;
  361.   SLList<char*> refs;
  362.   int preserve_ident;
  363. };
  364.  
  365. // Index expressions.
  366.  
  367. class
  368. tree_index_expression : public tree_multi_val_ret
  369. {
  370. public:
  371.   tree_index_expression (int l = -1, int c = -1) : tree_multi_val_ret (l, c)
  372.     {
  373.       id = 0;
  374.       list = 0;
  375.     }
  376.  
  377.   tree_index_expression (tree_identifier *i, int l = -1, int c = -1)
  378.     : tree_multi_val_ret (l, c)
  379.       {
  380.     id = new tree_indirect_ref (i);
  381.     list = 0;
  382.       }
  383.  
  384.   tree_index_expression (tree_identifier *i, tree_argument_list *lst,
  385.              int l = -1, int c = -1)
  386.     : tree_multi_val_ret (l, c)
  387.       {
  388.     id = new tree_indirect_ref (i);
  389.     list = lst;
  390.       }
  391.  
  392.   tree_index_expression (tree_indirect_ref *i, int l = -1, int c = -1)
  393.     : tree_multi_val_ret (l, c)
  394.       {
  395.     id = i;
  396.     list = 0;
  397.       }
  398.  
  399.   tree_index_expression (tree_indirect_ref *i, tree_argument_list *lst,
  400.              int l = -1, int c = -1)
  401.     : tree_multi_val_ret (l, c)
  402.       {
  403.     id = i;
  404.     list = lst;
  405.       }
  406.  
  407.   ~tree_index_expression (void);
  408.  
  409.   int is_index_expression (void) const
  410.     { return 1; }
  411.  
  412.   tree_indirect_ref *ident (void)
  413.     { return id; }
  414.  
  415.   char *name (void)
  416.     { return id->name (); }
  417.  
  418.   tree_argument_list *arg_list (void)
  419.     { return list; }
  420.  
  421.   void mark_for_possible_ans_assign (void)
  422.     {
  423.       if (id)
  424.     id->mark_for_possible_ans_assign ();
  425.     }
  426.  
  427.   tree_constant eval (int print);
  428.  
  429.   Octave_object eval (int print, int nargout, const Octave_object& args);
  430.  
  431.   void eval_error (void);
  432.  
  433.   void print_code (ostream& os);
  434.  
  435.  private:
  436.   tree_indirect_ref *id;
  437.   tree_argument_list *list;
  438. };
  439.  
  440. // Prefix expressions.
  441.  
  442. class
  443. tree_prefix_expression : public tree_expression
  444. {
  445.  public:
  446.   tree_prefix_expression (int l = -1, int c = -1) : tree_expression (l, c)
  447.     {
  448.       id = 0;
  449.       etype = unknown;
  450.     }
  451.  
  452.   tree_prefix_expression (tree_identifier *t, tree_expression::type et,
  453.               int l = -1, int c = -1)
  454.     : tree_expression (l, c)
  455.       {
  456.     id = t;
  457.     etype = et;
  458.       }
  459.  
  460.   ~tree_prefix_expression (void)
  461.     { delete id; }
  462.  
  463.   tree_constant eval (int print);
  464.  
  465.   void eval_error (void);
  466.  
  467.   int is_prefix_expression (void) const
  468.     { return 1; }
  469.  
  470.   char *oper (void) const;
  471.  
  472.   void print_code (ostream& os);
  473.  
  474.  private:
  475.   tree_identifier *id;
  476. };
  477.  
  478. // Postfix expressions.
  479.  
  480. class
  481. tree_postfix_expression : public tree_expression
  482. {
  483.  public:
  484.   tree_postfix_expression (int l = -1, int c = -1) : tree_expression (l, c)
  485.     {
  486.       id = 0;
  487.       etype = unknown;
  488.     }
  489.  
  490.   tree_postfix_expression (tree_identifier *t, tree_expression::type et,
  491.                int l = -1, int c = -1)
  492.     : tree_expression (l, c)
  493.       {
  494.     id = t;
  495.     etype = et;
  496.       }
  497.  
  498.   ~tree_postfix_expression (void)
  499.     { delete id; }
  500.  
  501.   tree_constant eval (int print);
  502.  
  503.   void eval_error (void);
  504.  
  505.   char *oper (void) const;
  506.  
  507.   void print_code (ostream& os);
  508.  
  509.  private:
  510.   tree_identifier *id;
  511. };
  512.  
  513. // Unary expressions.
  514.  
  515. class
  516. tree_unary_expression : public tree_expression
  517. {
  518.  public:
  519.   tree_unary_expression (int l = -1, int c = -1) : tree_expression (l, c)
  520.     {
  521.       etype = tree_expression::unknown;
  522.       op = 0;
  523.     }
  524.  
  525.   tree_unary_expression (tree_expression *a, tree_expression::type t,
  526.              int l = -1, int c = -1)
  527.     : tree_expression (l, c)
  528.       {
  529.     etype = t;
  530.     op = a;
  531.       }
  532.  
  533.   ~tree_unary_expression (void)
  534.     { delete op; }
  535.  
  536.   tree_constant eval (int print);
  537.  
  538.   void eval_error (void);
  539.  
  540.   char *oper (void) const;
  541.  
  542.   void print_code (ostream& os);
  543.  
  544.  private:
  545.   tree_expression *op;
  546. };
  547.  
  548. // Binary expressions.
  549.  
  550. class
  551. tree_binary_expression : public tree_expression
  552. {
  553.  public:
  554.   tree_binary_expression (int l = -1, int c = -1) : tree_expression (l, c)
  555.     {
  556.       etype = tree_expression::unknown;
  557.       op1 = 0;
  558.       op2 = 0;
  559.     }
  560.  
  561.   tree_binary_expression (tree_expression *a, tree_expression *b,
  562.               tree_expression::type t, int l = -1, int c = -1)
  563.     : tree_expression (l, c)
  564.       {
  565.     etype = t;
  566.     op1 = a;
  567.     op2 = b;
  568.       }
  569.  
  570.   ~tree_binary_expression (void)
  571.     {
  572.       delete op1;
  573.       delete op2;
  574.     }
  575.  
  576.   tree_constant eval (int print);
  577.  
  578.   void eval_error (void);
  579.  
  580.   char *oper (void) const;
  581.  
  582.   void print_code (ostream& os);
  583.  
  584.  private:
  585.   tree_expression *op1;
  586.   tree_expression *op2;
  587. };
  588.  
  589. // Simple assignment expressions.
  590.  
  591. class
  592. tree_simple_assignment_expression : public tree_expression
  593. {
  594. private:
  595.   void init (int plhs, int ans_assign)
  596.     {
  597.       etype = tree_expression::assignment;
  598.       lhs = 0;
  599.       index = 0;
  600.       rhs = 0;
  601.       preserve = plhs;
  602.       ans_ass = ans_assign;
  603.     }
  604.  
  605.  public:
  606.   tree_simple_assignment_expression (int plhs = 0, int ans_assign = 0,
  607.                      int l = -1, int c = -1)
  608.     : tree_expression (l, c)
  609.       { init (plhs, ans_assign); }
  610.  
  611.   tree_simple_assignment_expression (tree_identifier *i,
  612.                      tree_expression *r,
  613.                      int plhs = 0, int ans_assign = 0,
  614.                      int l = -1, int c = -1)
  615.     : tree_expression (l, c)
  616.       {
  617.     init (plhs, ans_assign);
  618.     lhs = new tree_indirect_ref (i);
  619.     rhs = r;
  620.       }
  621.  
  622.   tree_simple_assignment_expression (tree_indirect_ref *i,
  623.                      tree_expression *r,
  624.                      int plhs = 0, int ans_assign = 0,
  625.                      int l = -1, int c = -1)
  626.     : tree_expression (l, c)
  627.       {
  628.     init (plhs, ans_assign);
  629.     lhs = i;
  630.     rhs = r;
  631.       }
  632.  
  633.   tree_simple_assignment_expression (tree_index_expression *idx_expr,
  634.                      tree_expression *r,
  635.                      int plhs = 0, int ans_assign = 0,
  636.                      int l = -1, int c = -1)
  637.     : tree_expression (l, c)
  638.       {
  639.     init (plhs, ans_assign);
  640.     lhs = idx_expr->ident ();
  641.     index = idx_expr->arg_list ();
  642.     rhs = r;
  643.       }
  644.  
  645.   ~tree_simple_assignment_expression (void);
  646.  
  647.   int left_hand_side_is_identifier_only (void)
  648.     { return lhs->is_identifier_only (); }
  649.  
  650.   tree_identifier *left_hand_side_id (void)
  651.     { return lhs->ident (); }
  652.  
  653.   int is_ans_assign (void)
  654.     { return ans_ass; }
  655.  
  656.   tree_constant eval (int print);
  657.  
  658.   int is_assignment_expression (void) const
  659.     { return 1; }
  660.  
  661.   void eval_error (void);
  662.  
  663.   void print_code (ostream& os);
  664.  
  665.  private:
  666.   tree_indirect_ref *lhs;
  667.   tree_argument_list *index;
  668.   tree_expression *rhs;
  669.   int preserve;
  670.   int ans_ass;
  671. };
  672.  
  673. // Multi-valued assignment expressions.
  674.  
  675. class
  676. tree_multi_assignment_expression : public tree_multi_val_ret
  677. {
  678.  public:
  679.   tree_multi_assignment_expression (int l = -1, int c = -1)
  680.     : tree_multi_val_ret (l, c)
  681.       {
  682.     etype = tree_expression::multi_assignment;
  683.     lhs = 0;
  684.     rhs = 0;
  685.       }
  686.  
  687.   tree_multi_assignment_expression (tree_return_list *lst,
  688.                     tree_multi_val_ret *r,
  689.                     int l = -1, int c = -1)
  690.     : tree_multi_val_ret (l, c)
  691.       {
  692.     etype = tree_expression::multi_assignment;
  693.     lhs = lst;
  694.     rhs = r;
  695.       }
  696.  
  697.   ~tree_multi_assignment_expression (void);
  698.  
  699.   tree_constant eval (int print);
  700.  
  701.   Octave_object eval (int print, int nargout, const Octave_object& args);
  702.  
  703.   int is_assignment_expression (void) const
  704.     { return 1; }
  705.  
  706.   void eval_error (void);
  707.  
  708.   void print_code (ostream& os);
  709.  
  710.  private:
  711.   tree_return_list *lhs;
  712.   tree_multi_val_ret *rhs;
  713. };
  714.  
  715. // Colon expressions.
  716.  
  717. class
  718. tree_colon_expression : public tree_expression
  719. {
  720.  public:
  721.   tree_colon_expression (int l = -1, int c = -1) : tree_expression (l, c)
  722.     {
  723.       etype = tree_expression::colon;
  724.       op1 = 0;
  725.       op2 = 0;
  726.       op3 = 0;
  727.     }
  728.  
  729.   tree_colon_expression (tree_expression *a, tree_expression *b,
  730.              int l = -1, int c = -1)
  731.     : tree_expression (l, c)
  732.       {
  733.     etype = tree_expression::colon;
  734.     op1 = a;
  735.     op2 = b;
  736.     op3 = 0;
  737.       }
  738.  
  739.   ~tree_colon_expression (void)
  740.     {
  741.       delete op1;
  742.       delete op2;
  743.       delete op3;
  744.     }
  745.  
  746.   tree_colon_expression *chain (tree_expression *t);
  747.  
  748.   tree_constant eval (int print);
  749.  
  750.   void eval_error (const char *s);
  751.  
  752.   void print_code (ostream& os);
  753.  
  754.  private:
  755.   tree_expression *op1;
  756.   tree_expression *op2;
  757.   tree_expression *op3;
  758. };
  759.  
  760. // Builtin functions.
  761.  
  762. class
  763. tree_builtin : public tree_fvc
  764. {
  765. public:
  766.   tree_builtin (const char *nm = 0);
  767.  
  768.   tree_builtin (int i_max, int o_max, Mapper_fcn& m_fcn,
  769.         const char *nm = 0);
  770.  
  771.   tree_builtin (int i_max, int o_max, Octave_builtin_fcn f,
  772.         const char *nm = 0);
  773.  
  774. //  int is_builtin (void) const;
  775.  
  776.   int is_mapper_function (void) const
  777.     { return is_mapper; }
  778.  
  779.   tree_constant eval (int print);
  780.  
  781.   Octave_object eval (int print, int nargout, const Octave_object& args);
  782.  
  783.   char *name (void) const
  784.     { return my_name; }
  785.  
  786.   int max_expected_args (void);
  787.  
  788.   void print_code (ostream& os)
  789.     {
  790.       os << my_name << " can't be printed because it is a builtin function\n";
  791.     }
  792.  
  793. private:
  794.   int nargin_max;
  795.   int nargout_max;
  796.   int is_mapper;
  797.   Mapper_fcn mapper_fcn;
  798.   Octave_builtin_fcn fcn;
  799.   char *my_name;
  800. };
  801.  
  802. // User defined functions.
  803.  
  804. class
  805. tree_function : public tree_fvc
  806. {
  807. private:
  808.   void init (void)
  809.     {
  810.       call_depth = 0;
  811.       param_list = 0;
  812.       ret_list = 0;
  813.       sym_tab = 0;
  814.       cmd_list = 0;
  815.       file_name = 0;
  816.       fcn_name = 0;
  817.       t_parsed = 0;
  818.       system_fcn_file = 0;
  819.       num_named_args = 0;
  820.       num_args_passed = 0;
  821.       curr_va_arg_number = 0;
  822.       vr_list = 0;
  823.     }
  824.  
  825. public:
  826.   tree_function (int l = -1, int c = -1) : tree_fvc (l, c)
  827.     { init (); }
  828.  
  829.   tree_function (tree_statement_list *cl, symbol_table *st,
  830.          int l = -1, int c = -1)
  831.      : tree_fvc (l, c)
  832.        {
  833.      init ();
  834.      sym_tab = st;
  835.      cmd_list = cl;
  836.        }
  837.  
  838. //  tree_function *define (tree_statement_list *t);
  839.   tree_function *define_param_list (tree_parameter_list *t);
  840.   tree_function *define_ret_list (tree_parameter_list *t);
  841.  
  842.   void stash_fcn_file_name (void);
  843.  
  844.   void stash_fcn_file_time (time_t t)
  845.     { t_parsed = t; }
  846.  
  847.   char *fcn_file_name (void)
  848.     { return file_name; }
  849.  
  850.   time_t time_parsed (void)
  851.     { return t_parsed; }
  852.  
  853.   void mark_as_system_fcn_file (void);
  854.  
  855.   int is_system_fcn_file (void) const
  856.     { return system_fcn_file; }
  857.  
  858.   int takes_varargs (void) const;
  859.  
  860.   void octave_va_start (void)
  861.     { curr_va_arg_number = num_named_args; }
  862.  
  863.   tree_constant octave_va_arg (void);
  864.  
  865.   Octave_object octave_all_va_args (void);
  866.  
  867.   int takes_var_return (void) const;
  868.  
  869.   void octave_vr_val (const tree_constant& val);
  870.  
  871.   void stash_function_name (char *s);
  872.  
  873.   char *function_name (void)
  874.     { return fcn_name; }
  875.  
  876.   tree_constant eval (int print);
  877.  
  878.   Octave_object eval (int print, int nargout, const Octave_object& args);
  879.  
  880.   int max_expected_args (void);
  881.  
  882.   void traceback_error (void);
  883.  
  884.   void print_code (ostream& os);
  885.  
  886. private:
  887.   int call_depth;
  888.   tree_parameter_list *param_list;
  889.   tree_parameter_list *ret_list;
  890.   symbol_table *sym_tab;
  891.   tree_statement_list *cmd_list;
  892.   char *file_name;
  893.   char *fcn_name;
  894.   time_t t_parsed;
  895.   int system_fcn_file;
  896.   int num_named_args;
  897.   Octave_object args_passed;
  898.   int num_args_passed;
  899.   int curr_va_arg_number;
  900.   tree_va_return_list *vr_list;
  901. };
  902.  
  903. #endif
  904.  
  905. /*
  906. ;;; Local Variables: ***
  907. ;;; mode: C++ ***
  908. ;;; page-delimiter: "^/\\*" ***
  909. ;;; End: ***
  910. */
  911.