2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
5 /* $Id: statement.g,v 3.26 1994/06/24 12:06:12 ceriel Exp $ */
6 /* STATEMENT SYNTAX PARSER */
18 #include "botch_free.h"
35 extern char options[];
38 /* Each statement construction is stacked in order to trace a ???
39 statement to such a construction. Example: a case statement should
40 be recognized as a piece of the most enclosing switch statement.
108 print_expr("expression_statement", expr);
110 code_expr(expr, RVAL, FALSE, NO_LABEL, NO_LABEL);
111 free_expression(expr);
121 /* This allows the following absurd case:
125 grz: printf("A labelled statement\n");
132 C_df_ilb((label)idf->id_def->df_address);
139 label l_true = text_label();
140 label l_false = text_label();
141 label l_end = text_label();
148 opnd2test(&expr, IF);
149 if (is_cp_cst(expr)) {
150 /* The comparison has been optimized
153 if (expr->VL_VALUE == (arith)0) {
156 /* else fall through */
162 code_expr(expr, RVAL, TRUE, l_true, l_false);
168 free_expression(expr);
200 label l_break = text_label();
201 label l_continue = text_label();
202 label l_body = text_label();
207 stack_stmt(l_break, l_continue);
208 C_df_ilb(l_continue);
213 opnd2test(&expr, WHILE);
214 if (is_cp_cst(expr)) {
215 if (expr->VL_VALUE == (arith)0) {
220 code_expr(expr, RVAL, TRUE, l_body, l_break);
225 start_while_stmt(expr);
235 free_expression(expr);
245 label l_break = text_label();
246 label l_continue = text_label();
247 label l_body = text_label();
252 stack_stmt(l_break, l_continue);
264 C_df_ilb(l_continue);
268 opnd2test(&expr, WHILE);
269 if (is_cp_cst(expr)) {
270 if (expr->VL_VALUE == (arith)1) {
274 end_do_stmt(1, expr->VL_VALUE != (arith)0);
278 code_expr(expr, RVAL, TRUE, l_body, l_break);
289 free_expression(expr);
294 { struct expr *e_init = 0, *e_test = 0, *e_incr = 0;
295 label l_break = text_label();
296 label l_continue = text_label();
297 label l_body = text_label();
298 label l_test = text_label();
302 { stack_stmt(l_break, l_continue);
307 { code_expr(e_init, RVAL, FALSE, NO_LABEL, NO_LABEL);
316 opnd2test(&e_test, FOR);
317 if (is_cp_cst(e_test)) {
318 if (e_test->VL_VALUE == (arith)0) {
323 code_expr(e_test, RVAL, TRUE, l_body, l_break);
333 start_for_stmt(e_test);
341 C_df_ilb(l_continue);
343 code_expr(e_incr, RVAL, FALSE,
348 free_expression(e_init);
349 free_expression(e_test);
350 free_expression(e_incr);
366 code_startswitch(&expr);
368 start_switch_part(is_cp_cst(expr));
378 free_expression(expr);
388 constant_expression(&expr)
394 free_expression(expr);
414 { struct expr *expr = 0;
425 do_return_expr(expr);
426 free_expression(expr);
428 lint_return_stmt(VALRETURNED);
436 lint_return_stmt(NOVALRETURNED);
452 C_bra((label)idf->id_def->df_address);
462 static int brc_level = 1;
463 int decl_seen = brc_level == 1;
464 #endif /* DBSYMTAB */
471 [%while ((DOT != IDENTIFIER && AHEAD != ':') ||
472 (DOT == IDENTIFIER && AHEAD == IDENTIFIER))
473 /* >>> conflict on TYPE_IDENTIFIER, IDENTIFIER */
478 #endif /* DBSYMTAB */
484 if (options['g'] && decl_seen) {
485 C_ms_std((char *) 0, N_LBRAC, brc_level);
487 #endif /* DBSYMTAB */
496 if (options['g'] && decl_seen) {
497 C_ms_std((char *) 0, N_RBRAC, brc_level);
500 #endif /* DBSYMTAB */
512 { asm_bts = dot.tk_bts;
513 asm_len = dot.tk_len;
517 { code_asm(asm_bts, asm_len);