annotate src/pt-cmd.cc @ 584:4057f845c1ee

[project @ 1994-08-07 04:40:03 by jwe]
author jwe
date Sun, 07 Aug 1994 04:40:03 +0000
parents bc813f5eb025
children 8e4e7e5f307e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 494
diff changeset
1 // tree-cmd.cc -*- C++ -*-
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
2 /*
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
3
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1992, 1993, 1994 John W. Eaton
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
5
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
7
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
11 later version.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
12
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
16 for more details.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
17
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
21
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
22 */
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
23
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
25 #include "config.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
26 #endif
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
27
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
28 #if defined (__GNUG__)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
29 #pragma implementation
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
30 #endif
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
31
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
32 #include <iostream.h>
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
33
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
34 // Nonzero means we're breaking out of a loop.
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
35 int breaking = 0;
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
36
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
37 // Nonzero means we're jumping to the end of a loop.
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
38 int continuing = 0;
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
39
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
40 // Nonzero means we're returning from a function. Global because it
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
41 // is also needed in tree-expr.cc.
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
42 int returning = 0;
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
43
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
44 #include "user-prefs.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
45 #include "variables.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
46 #include "symtab.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
47 #include "error.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
48 #include "gripes.h"
584
4057f845c1ee [project @ 1994-08-07 04:40:03 by jwe]
jwe
parents: 581
diff changeset
49 #include "tree-base.h"
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
50 #include "tree-expr.h"
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
51 #include "tree-cmd.h"
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
52 #include "tree-misc.h"
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
53 #include "tree-const.h"
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
54
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
55 // Decide if it's time to quit a for or while loop.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
56 static int
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
57 quit_loop_now (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
58 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
59 // Maybe handle `continue N' someday...
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
60
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
61 if (continuing)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
62 continuing--;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
63
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
64 int quit = (returning || breaking || continuing);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
65
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
66 if (breaking)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
67 breaking--;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
68
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
69 return quit;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
70 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
71
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
72 // But first, some extra functions used by the tree classes.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
73
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
74 // We seem to have no use for this now. Maybe it will be needed at
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
75 // some future date, so here it is.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
76 #if 0
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
77
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
78 // Convert a linked list of trees to a vector of pointers to trees.
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
79
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
80 static tree **
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
81 list_to_vector (tree *list, int& len)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
82 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
83 len = list->length () + 1;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
84
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
85 tree **args = new tree * [len];
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
86
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
87 // args[0] may eventually hold something useful, like the function
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
88 // name.
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
89 tree *tmp_list = list;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
90 for (int k = 1; k < len; k++)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
91 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
92 args[k] = tmp_list;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
93 tmp_list = tmp_list->next_elem ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
94 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
95 return args;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
96 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
97 #endif
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
98
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
99 // Global.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
100
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
101 tree_global_command::~tree_global_command (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
102 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
103 delete init_list;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
104 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
105
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
106 void
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
107 tree_global_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
108 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
109 if (init_list)
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
110 init_list->eval ();
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
111
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
112 if (error_state > 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
113 ::error ("evaluating global command near line %d, column %d",
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
114 line (), column ());
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
115 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
116
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
117 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
118 tree_global_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
119 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
120 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
121
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
122 os << "global ";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
123
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
124 if (init_list)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
125 init_list->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
126 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
127
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
128 // While.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
129
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
130 tree_while_command::~tree_while_command (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
131 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
132 delete expr;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
133 delete list;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
134 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
135
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
136 void
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
137 tree_while_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
138 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
139 if (error_state)
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
140 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
141
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
142 for (;;)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
143 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
144 int expr_value = 0;
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 494
diff changeset
145 if (! expr)
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
146 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
147 tree_constant t1 = expr->eval (0);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
148
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
149 if (error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
150 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
151 eval_error ();
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
152 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
153 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
154
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
155 if (t1.rows () == 0 || t1.columns () == 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
156 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
157 int flag = user_pref.propagate_empty_matrices;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
158 if (flag < 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
159 warning ("while: empty matrix used in conditional");
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
160 else if (flag == 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
161 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
162 ::error ("while: empty matrix used in conditional");
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
163 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
164 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
165 t1 = tree_constant (0.0);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
166 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
167 else if (! t1.is_scalar_type ())
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
168 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
169 tree_constant t2 = t1.all ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
170 t1 = t2.all ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
171 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
172
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
173 tree_constant_rep::constant_type t = t1.const_type ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
174 if (t == tree_constant_rep::scalar_constant)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
175 expr_value = (int) t1.double_value ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
176 else if (t == tree_constant_rep::complex_scalar_constant)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
177 expr_value = t1.complex_value () != 0.0;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
178 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
179 panic_impossible ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
180
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
181 if (expr_value)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
182 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 494
diff changeset
183 if (list)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
184 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
185 list->eval (1);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
186 if (error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
187 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
188 eval_error ();
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
189 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
190 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
191 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
192
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
193 if (quit_loop_now ())
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
194 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
195 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
196 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
197 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
198 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
199 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
200
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
201 void
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
202 tree_while_command::eval_error (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
203 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
204 if (error_state > 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
205 ::error ("evaluating while command near line %d, column %d",
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
206 line (), column ());
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
207 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
208
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
209 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
210 tree_while_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
211 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
212 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
213
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
214 os << "while ";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
215
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
216 if (expr)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
217 expr->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
218
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
219 print_code_new_line (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
220
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
221 if (list)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
222 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
223 increment_indent_level ();
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
224 list->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
225 decrement_indent_level ();
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
226 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
227
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
228 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
229
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
230 os << "endwhile";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
231 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
232
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
233 // For.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
234
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
235 tree_for_command::~tree_for_command (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
236 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
237 delete id;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
238 delete expr;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
239 delete list;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
240 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
241
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
242 void
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
243 tree_for_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
244 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 494
diff changeset
245 if (error_state || ! expr)
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
246 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
247
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
248 tree_constant tmp_expr = expr->eval (0);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
249
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
250 if (error_state || tmp_expr.is_undefined ())
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
251 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
252 eval_error ();
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
253 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
254 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
255
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
256 tree_constant_rep::constant_type expr_type = tmp_expr.const_type ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
257 switch (expr_type)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
258 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
259 case tree_constant_rep::complex_scalar_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
260 case tree_constant_rep::scalar_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
261 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
262 tree_constant *rhs = new tree_constant (tmp_expr);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
263 int quit = 0;
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
264 do_for_loop_once (rhs, quit);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
265 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
266 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
267 case tree_constant_rep::complex_matrix_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
268 case tree_constant_rep::matrix_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
269 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
270 Matrix m_tmp;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
271 ComplexMatrix cm_tmp;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
272 int nr;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
273 int steps;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
274 if (expr_type == tree_constant_rep::matrix_constant)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
275 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
276 m_tmp = tmp_expr.matrix_value ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
277 nr = m_tmp.rows ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
278 steps = m_tmp.columns ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
279 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
280 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
281 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
282 cm_tmp = tmp_expr.complex_matrix_value ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
283 nr = cm_tmp.rows ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
284 steps = cm_tmp.columns ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
285 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
286
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
287 for (int i = 0; i < steps; i++)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
288 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
289 tree_constant *rhs;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
290
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
291 if (nr == 1)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
292 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
293 if (expr_type == tree_constant_rep::matrix_constant)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
294 rhs = new tree_constant (m_tmp (0, i));
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
295 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
296 rhs = new tree_constant (cm_tmp (0, i));
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
297 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
298 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
299 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
300 if (expr_type == tree_constant_rep::matrix_constant)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
301 rhs = new tree_constant (m_tmp.extract (0, i, nr-1, i));
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
302 else
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
303 rhs = new tree_constant (cm_tmp.extract (0, i, nr-1, i));
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
304 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
305
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
306 int quit = 0;
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
307 do_for_loop_once (rhs, quit);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
308 if (quit)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
309 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
310 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
311 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
312 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
313 case tree_constant_rep::string_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
314 gripe_string_invalid ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
315 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
316 case tree_constant_rep::range_constant:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
317 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
318 Range rng = tmp_expr.range_value ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
319
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
320 int steps = rng.nelem ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
321 double b = rng.base ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
322 double increment = rng.inc ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
323
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
324 for (int i = 0; i < steps; i++)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
325 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
326 double tmp_val = b + i * increment;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
327
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
328 tree_constant *rhs = new tree_constant (tmp_val);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
329
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
330 int quit = 0;
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
331 do_for_loop_once (rhs, quit);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
332 if (quit)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
333 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
334 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
335 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
336 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
337 default:
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
338 panic_impossible ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
339 break;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
340 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
341 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
342
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
343 void
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
344 tree_for_command::eval_error (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
345 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
346 if (error_state > 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
347 ::error ("evaluating for command near line %d, column %d",
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
348 line (), column ());
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
349 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
350
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
351 void
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
352 tree_for_command::do_for_loop_once (tree_constant *rhs, int& quit)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
353 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
354 quit = 0;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
355
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
356 tree_simple_assignment_expression tmp_ass (id, rhs, 1);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
357
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
358 tmp_ass.eval (0);
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
359
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
360 if (error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
361 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
362 eval_error ();
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
363 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
364 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
365
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 494
diff changeset
366 if (list)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
367 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
368 list->eval (1);
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
369 if (error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
370 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
371 eval_error ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
372 quit = 1;
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
373 return;
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
374 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
375 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
376
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
377 quit = quit_loop_now ();
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
378 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
379
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
380 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
381 tree_for_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
382 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
383 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
384
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
385 os << "for ";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
386
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
387 if (id)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
388 id->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
389
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
390 os << " = ";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
391
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
392 if (expr)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
393 expr->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
394
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
395 print_code_new_line (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
396
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
397 if (list)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
398 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
399 increment_indent_level ();
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
400 list->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
401 decrement_indent_level ();
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
402 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
403
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
404 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
405
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
406 os << "endfor";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
407 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
408
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
409 // If.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
410
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
411 tree_if_command::~tree_if_command (void)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
412 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
413 delete list;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
414 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
415
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
416 void
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
417 tree_if_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
418 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
419 if (list)
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
420 list->eval ();
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
421
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
422 if (error_state > 0)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
423 ::error ("evaluating if command near line %d, column %d",
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
424 line (), column ());
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
425 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
426
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
427 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
428 tree_if_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
429 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
430 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
431
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
432 os << "if ";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
433
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
434 if (list)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
435 list->print_code (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
436
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
437 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
438
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
439 os << "endif";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
440 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
441
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
442 // Break.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
443
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
444 void
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
445 tree_break_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
446 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
447 if (! error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
448 breaking = 1;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
449 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
450
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
451 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
452 tree_break_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
453 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
454 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
455
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
456 os << "break";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
457 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
458
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
459 // Continue.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
460
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
461 void
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
462 tree_continue_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
463 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
464 if (! error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
465 continuing = 1;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
466 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
467
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
468 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
469 tree_continue_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
470 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
471 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
472
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
473 os << "continue";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
474 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
475
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
476 // Return.
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
477
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
478 void
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
479 tree_return_command::eval (void)
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
480 {
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
481 if (! error_state)
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
482 returning = 1;
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
483 }
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
484
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
485 void
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
486 tree_return_command::print_code (ostream& os)
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
487 {
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
488 print_code_indent (os);
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
489
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
490 os << "return";
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
491 }
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 578
diff changeset
492
494
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
493 /*
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
494 ;;; Local Variables: ***
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
495 ;;; mode: C++ ***
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
496 ;;; page-delimiter: "^/\\*" ***
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
497 ;;; End: ***
2c4d694b87e9 [project @ 1994-07-06 14:55:23 by jwe]
jwe
parents:
diff changeset
498 */