00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #define ANTLR_VERSION 123
00011
00012
00013
00014
00015
00016
00017 #include "parser_charbuf.h"
00018 #include "ParserContext.h"
00019
00020 #include "../Boolean.h"
00021 #include "../utilities/string_util.h"
00022
00023 class Expression;
00024 class Symbol;
00025 class Symtab;
00026
00027
00028
00029
00030
00031 class ExpressionList;
00032
00033
00034 class DistributeExpr;
00035
00036
00037 #define zzEOF_TOKEN 1
00038 #define zzSET_SIZE 16
00039 #include "antlr.h"
00040 #include "tokens.h"
00041 #include "dlgdef.h"
00042 #include "mode.h"
00043 ANTLR_INFO
00044
00045
00046 #include "parser_prepass.h"
00047 #include "parser_util.h"
00048 #include "parser.h"
00049
00050 #include <ctype.h>
00051 #include <stream.h>
00052 #include <strstream.h>
00053
00054 #include "../Boolean.h"
00055 #include "../p-assert.h"
00056
00057 #include "Assertion.h"
00058 #include "Assertion.all.h"
00059 #include "Directive.h"
00060 #include "../Expression/Expression.h"
00061 #include "../Expression/BinaryExpr.h"
00062 #include "../Expression/LogicalConstExpr.h"
00063 #include "../Expression/RealConstExpr.h"
00064 #include "../Expression/IntConstExpr.h"
00065 #include "../Expression/StringConstExpr.h"
00066 #include "../ProgramUnit.h"
00067 #include "../Statement/Statement.h"
00068 #include "../Statement/BlockEntryStmt.h"
00069 #include "../Statement/BlockExitStmt.h"
00070 #include "../Symbol/Symbol.h"
00071 #include "../Symtab.h"
00072 #include "TreeBuilder.h"
00073
00074 #include "../Expression/DistributeExpr.h"
00075
00076 class ExpressionList : public List<Expression> {
00077
00078 };
00079
00080 Expression *make_afi_node(Expression *arg1, Expression *arg2);
00081 void parse_error(const char *);
00082
00083
00084
00085
00086
00087
00088
00089 static void
00090 list_absorb(List<Expression> &source,
00091 List<Expression> *to_append_and_delete)
00092 {
00093 if (to_append_and_delete != 0) {
00094 while (to_append_and_delete->first_ref() != 0) {
00095 source.ins_last(to_append_and_delete->grab(
00096 *to_append_and_delete->first_ref()));
00097 }
00098
00099
00100
00101 p_assert(to_append_and_delete->entries() == 0, "Internal Error");
00102
00103 delete to_append_and_delete;
00104 }
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114 static void
00115 validate_expr_list_types(ExpressionList &list,
00116 const char *err_message,
00117 OP_TYPE op_type1,
00118 OP_TYPE op_type2 = (OP_TYPE)(-1))
00119 {
00120 for (Mutator<Expression> iter = list; iter.valid(); ++iter) {
00121 if (iter.current().op() == op_type1 ||
00122 iter.current().op() == op_type2) {
00123
00124 }
00125 else {
00126
00127 ostrstream s;
00128
00129 s << "Expected " << err_message << " but found: "
00130 << iter.current() << ends;
00131
00132 char *str = s.str();
00133 parse_error(str);
00134
00135 delete str;
00136
00137
00138 iter.del();
00139 }
00140 }
00141 }
00142
00143
00144
00145
00146 Boolean
00147 is_array_symbol(Expression &expr)
00148 {
00149 if ( expr.op() == ID_OP ) {
00150 Symbol &sym = expr.symbol();
00151
00152 if ( sym.sym_class() == VARIABLE_CLASS && sym.is_array() )
00153 return True;
00154 }
00155
00156 return False;
00157 }
00158
00159
00160
00161
00162 Boolean
00163 is_scalar_var(Expression &expr)
00164 {
00165 if (expr.op() == ID_OP) {
00166 Symbol &sym = expr.symbol();
00167
00168 if (sym.sym_class() == VARIABLE_CLASS && !sym.is_array())
00169 return True;
00170 }
00171
00172 return False;
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 static void
00184 validate_expr_list_types(ExpressionList &list,
00185 const char *err_message,
00186 Boolean can_be_scalar_var,
00187 Boolean can_be_array_elem,
00188 Boolean can_be_entire_array)
00189 {
00190 p_assert(can_be_scalar_var || can_be_array_elem, "Arguments error");
00191
00192 for (Mutator<Expression> iter = list; iter.valid(); ++iter) {
00193 if ( can_be_scalar_var && is_scalar_var( iter.current() ) ) {
00194 continue;
00195 }
00196 else if ( can_be_array_elem && iter.current().op() == ARRAY_REF_OP ) {
00197 continue;
00198 }
00199 else if ( can_be_entire_array && is_array_symbol( iter.current() ) ) {
00200 continue;
00201 }
00202 else {
00203
00204 ostrstream s;
00205 s << "Expected " << err_message << " but found: "
00206 << iter.current() << ends;
00207 char *str = s.str();
00208 parse_error(str);
00209 delete str;
00210
00211
00212 iter.del();
00213 }
00214 }
00215 }
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 Expression *
00230 make_afi_node(Expression *arg1, Expression *arg2)
00231 {
00232 if (arg1 == 0 || arg2 == 0) {
00233
00234 if (arg1)
00235 delete arg1;
00236 if (arg2)
00237 delete arg2;
00238
00239 return 0;
00240 }
00241
00242
00243
00244
00245 if (arg1->op() != ID_OP) {
00246 if (arg1->type().data_type() == CHARACTER_TYPE) {
00247
00248 return substring(arg1, arg2);
00249 }
00250 else {
00251
00252 ostrstream oss;
00253 oss << "function call/array ref syntax "
00254 << "for invalid object type: `" << *arg1 << "'" << ends;
00255 char *s = oss.str();
00256 parse_error(s);
00257 delete [] s;
00258 return 0;
00259 }
00260 }
00261
00262 Symbol &sym = arg1->symbol();
00263
00264 switch(sym.sym_class()) {
00265 default:
00266 {
00267 String msg = (String)"function call/array ref syntax "
00268 "for non-function and non-variable `" + sym.name_ref() + "'";
00269 parse_error(msg);
00270 }
00271 break;
00272
00273 case FUNCTION_CLASS:
00274
00275
00276
00277 if (sym.intrinsic() == IS_INTRINSIC)
00278 return intrinsic_call(arg1, arg2);
00279 else
00280 return function_call(arg1, arg2);
00281 break;
00282
00283 case VARIABLE_CLASS:
00284 {
00285 if (!sym.is_array()) {
00286 String msg = (String)"variable `" + sym.name_ref()
00287 + "' is not an array";
00288 parse_error(msg);
00289 return 0;
00290 }
00291
00292
00293
00294 return array_reference(id(sym), arg2);
00295 }
00296 break;
00297 }
00298 }
00299
00300
00301
00302
00303 static void
00304 force_parallel(ParserContext &context, Symbol *scalar,
00305 const char *directive_name)
00306 {
00307 Statement *s_do = &context.s_next;
00308
00309 AssertParallel *as_par
00310 = (AssertParallel *) assertion_of_type( s_do->assertions(),
00311 AS_PARALLEL );
00312 if (as_par == 0) {
00313 as_par = new AssertParallel;
00314
00315 if (s_do->stmt_class() == DO_STMT) {
00316 if (scalar == 0)
00317 as_par->arg_list_guarded().ins_first( s_do->index().clone() );
00318 else
00319 as_par->arg_list_guarded().ins_first( id(*scalar) );
00320 }
00321
00322 s_do->assertions().ins_first( as_par );
00323 }
00324 }
00325
00326
00327
00328
00329
00330
00331
00332 static void
00333 append_shared_data_objects(Expression* e_id, DistributeExpr* e_dist,
00334 ExpressionList* list)
00335 {
00336 if (e_dist) {
00337
00338
00339
00340
00341 p_assert((e_id && e_id->op() == ID_OP), "Illegal shared array name");
00342
00343 e_dist->symbol(e_id->symbol());
00344
00345
00346 p_assert( e_dist->is_well_defined(), "Distribution is not well defined" );
00347
00348
00349 delete e_id;
00350 list->ins_last(e_dist);
00351 }
00352 else {
00353
00354
00355 p_assert((e_id && is_scalar_var(*e_id)), "Illegal shared scalar name");
00356
00357 list->ins_last(e_id);
00358 }
00359 }
00360
00361
00362
00363
00364 void
00365 parse_comment_or_directive(const String &dir, ProgramUnit &pgm,
00366 Statement *s_prev, Statement *s_next)
00367 {
00368
00369
00370
00371 if (dir.index_case( "CSRD$" ) == 0
00372 || dir.index_case( "C$DIR" ) == 0
00373 || dir.index_case( "C$DOACROSS" ) == 0
00374
00375 || dir.index_case( "CDIR$" ) == 0) {
00376
00377 char *prepass = parser_prepass(dir);
00378
00379 if (!prepass) {
00380 parse_error("Lexical error");
00381 return;
00382 }
00383
00384
00385
00386 ParserContext context(pgm, s_prev, s_next);
00387
00388
00389
00390
00391
00392
00393 ANTLRs(parser_comment_or_directive(context, dir), prepass);
00394
00395 delete [] prepass;
00396 }
00397 else {
00398 AssertComment *a = new AssertComment;
00399
00400 s_next->assertions().ins_last( a );
00401
00402 const char *p = dir;
00403
00404
00405
00406 p_assert( (*p == 'C' || *p == 'c' || *p == '@' ||
00407 *p == '!' || *p == '*' || *p == '%' ),
00408 "Internal Error" );
00409 p += 1;
00410
00411 StringElem *s_elem = new StringElem( p );
00412
00413 a->string_arg_list_guarded().ins_last( s_elem );
00414 }
00415 }
00416
00417
00418
00419 void
00420 parse_error(const char *s)
00421 {
00422 cout << "*** PARSE ERROR: " << s << endl;
00423 }
00424
00425 void
00426 parse_error(const String &s)
00427 {
00428 parse_error((const char *)s);
00429 }
00430
00431
00432
00433
00434
00435
00436
00437
00438 static void
00439 insert_or_delete(Assertion *assertion_ref, Expression *e)
00440 {
00441 if (! assertion_ref)
00442 delete e;
00443 else {
00444 if ( e )
00445 assertion_ref->arg_list_guarded().ins_last( e );
00446 }
00447 }
00448
00449
00450
00451 void
00452 #ifdef __STDC__
00453 parser_comment_or_directive( ParserContext &context, const char *line )
00454 #else
00455 parser_comment_or_directive(context,line)
00456 ParserContext &context;
00457 const char *line ;
00458 #endif
00459 {
00460 zzRULE;
00461 zzBLOCK(zztasp1);
00462 zzMake0;
00463 {
00464 if ( (LA(1)==CSRD_TOKEN) ) {
00465 zzmatch(CSRD_TOKEN); zzCONSUME;
00466 parser_csrd_directive( context );
00467 zzmode( START );
00468 }
00469 else {
00470 if ( (LA(1)==CONVEX_TOKEN) ) {
00471 zzmatch(CONVEX_TOKEN); zzCONSUME;
00472 parser_convex_directive( context );
00473 zzmode( START );
00474 }
00475 else {
00476 if ( (LA(1)==SGI_TOKEN) ) {
00477 zzmatch(SGI_TOKEN); zzCONSUME;
00478 parser_sgi_directive( context );
00479 zzmode( START );
00480 }
00481 else {
00482 if ( (LA(1)==COMMENT_START) ) {
00483 zzmatch(COMMENT_START); zzCONSUME;
00484 parser_comment( context, line );
00485 zzmode( START );
00486 }
00487 else {
00488 if ( (
00489 LA(1)==CRAY_TOKEN) ) {
00490 zzmatch(CRAY_TOKEN); zzCONSUME;
00491 parser_cray_directive( context );
00492 zzmode( START );
00493 }
00494 else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
00495 }
00496 }
00497 }
00498 }
00499 zzEXIT(zztasp1);
00500 return;
00501 fail:
00502 zzEXIT(zztasp1);
00503 zzsyn(zzMissText, zzBadTok, "Fortran comment or directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
00504 zzresynch(setwd1, 0x1);
00505 }
00506 }
00507
00508 void
00509 #ifdef __STDC__
00510 parser_comment( ParserContext &context, const char *line )
00511 #else
00512 parser_comment(context,line)
00513 ParserContext &context;
00514 const char *line ;
00515 #endif
00516 {
00517 zzRULE;
00518 zzBLOCK(zztasp1);
00519 zzMake0;
00520 {
00521 zzmatch(1);
00522
00523
00524
00525
00526
00527
00528
00529 {
00530 AssertComment *a = new AssertComment;
00531
00532 context.s_next.assertions().ins_last( a );
00533
00534 const char *p = line;
00535
00536
00537
00538 p_assert( (*p == 'C' || *p == 'c' || *p == '@' ||
00539 *p == '!' || *p == '*' || *p == '%' ),
00540 "Internal Error" );
00541 p += 1;
00542
00543 StringElem *s_elem = new StringElem( p );
00544
00545 a->string_arg_list_guarded().ins_last( s_elem );
00546 }
00547 zzCONSUME;
00548 zzEXIT(zztasp1);
00549 return;
00550 fail:
00551 zzEXIT(zztasp1);
00552 zzsyn(zzMissText, zzBadTok, "Fortran comment", zzMissSet, zzMissTok, zzErrk, zzBadText);
00553 zzresynch(setwd1, 0x2);
00554 }
00555 }
00556
00557 Expression *
00558 #ifdef __STDC__
00559 parser_expression( Symtab &symtab )
00560 #else
00561 parser_expression(symtab)
00562 Symtab &symtab ;
00563 #endif
00564 {
00565 Expression * _retv;
00566 zzRULE;
00567 zzBLOCK(zztasp1);
00568 zzMake0;
00569 {
00570 _retv = 0;
00571 _retv = parser_expr100( symtab );
00572
00573 zzEXIT(zztasp1);
00574 return _retv;
00575 fail:
00576 zzEXIT(zztasp1);
00577 zzsyn(zzMissText, zzBadTok, "Fortran expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00578 zzresynch(setwd1, 0x4);
00579 return _retv;
00580 }
00581 }
00582
00583 Expression *
00584 #ifdef __STDC__
00585 parser_expr100( Symtab &symtab )
00586 #else
00587 parser_expr100(symtab)
00588 Symtab &symtab ;
00589 #endif
00590 {
00591 Expression * _retv;
00592 zzRULE;
00593 zzBLOCK(zztasp1);
00594 zzMake0;
00595 {
00596 Expression *arg; OP_TYPE op;
00597 TreeBuilder *tree = new TreeBuilder;
00598 _retv = 0;
00599 arg = parser_expr120( symtab );
00600
00601 tree->left_arg(arg);
00602 {
00603 zzBLOCK(zztasp2);
00604 zzMake0;
00605 {
00606 while ( (LA(1)==29 || LA(1)==30) ) {
00607 {
00608 zzBLOCK(zztasp3);
00609 zzMake0;
00610 {
00611 if ( (LA(1)==29) ) {
00612 zzmatch(29);
00613 op = EQV_OP;
00614 zzCONSUME;
00615 }
00616 else {
00617 if ( (LA(1)==30) ) {
00618 zzmatch(30);
00619 op = NEQV_OP;
00620 zzCONSUME;
00621 }
00622 else {zzFAIL(1,zzerr2,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
00623 }
00624 zzEXIT(zztasp3);
00625 }
00626 }
00627 arg = parser_expr120( symtab );
00628
00629
00630 tree->add_arg(op, ASSOCIATIVE_OP, arg);
00631 zzLOOP(zztasp2);
00632 }
00633 zzEXIT(zztasp2);
00634 }
00635 }
00636 _retv = tree->grab(); delete tree;
00637 zzEXIT(zztasp1);
00638 return _retv;
00639 fail:
00640 zzEXIT(zztasp1);
00641 zzsyn(zzMissText, zzBadTok, "Fortran .EQV./.NEQV. expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00642 zzresynch(setwd1, 0x8);
00643 return _retv;
00644 }
00645 }
00646
00647 Expression *
00648 #ifdef __STDC__
00649 parser_expr120( Symtab &symtab )
00650 #else
00651 parser_expr120(symtab)
00652 Symtab &symtab ;
00653 #endif
00654 {
00655 Expression * _retv;
00656 zzRULE;
00657 zzBLOCK(zztasp1);
00658 zzMake0;
00659 {
00660 Expression *arg; TreeBuilder *tree = new TreeBuilder;
00661 _retv = 0;
00662 arg = parser_expr130( symtab );
00663
00664 tree->left_arg(arg);
00665 {
00666 zzBLOCK(zztasp2);
00667 zzMake0;
00668 {
00669 while ( (
00670 LA(1)==31) ) {
00671 zzmatch(31); zzCONSUME;
00672 arg = parser_expr130( symtab );
00673
00674
00675 tree->add_arg(OR_OP, ASSOCIATIVE_OP, arg);
00676 zzLOOP(zztasp2);
00677 }
00678 zzEXIT(zztasp2);
00679 }
00680 }
00681 _retv = tree->grab(); delete tree;
00682 zzEXIT(zztasp1);
00683 return _retv;
00684 fail:
00685 zzEXIT(zztasp1);
00686 zzsyn(zzMissText, zzBadTok, "Fortran .OR. expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00687 zzresynch(setwd1, 0x10);
00688 return _retv;
00689 }
00690 }
00691
00692 Expression *
00693 #ifdef __STDC__
00694 parser_expr130( Symtab &symtab )
00695 #else
00696 parser_expr130(symtab)
00697 Symtab &symtab ;
00698 #endif
00699 {
00700 Expression * _retv;
00701 zzRULE;
00702 zzBLOCK(zztasp1);
00703 zzMake0;
00704 {
00705 Expression *arg; TreeBuilder *tree = new TreeBuilder;
00706 _retv = 0;
00707 arg = parser_expr140( symtab );
00708
00709 tree->left_arg(arg);
00710 {
00711 zzBLOCK(zztasp2);
00712 zzMake0;
00713 {
00714 while ( (LA(1)==32) ) {
00715 zzmatch(32); zzCONSUME;
00716 arg = parser_expr140( symtab );
00717
00718
00719 tree->add_arg(AND_OP, ASSOCIATIVE_OP, arg);
00720 zzLOOP(zztasp2);
00721 }
00722 zzEXIT(zztasp2);
00723 }
00724 }
00725 _retv = tree->grab(); delete tree;
00726 zzEXIT(zztasp1);
00727 return _retv;
00728 fail:
00729 zzEXIT(zztasp1);
00730 zzsyn(zzMissText, zzBadTok, "Fortran .AND. expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00731 zzresynch(setwd1, 0x20);
00732 return _retv;
00733 }
00734 }
00735
00736 Expression *
00737 #ifdef __STDC__
00738 parser_expr140( Symtab &symtab )
00739 #else
00740 parser_expr140(symtab)
00741 Symtab &symtab ;
00742 #endif
00743 {
00744 Expression * _retv;
00745 zzRULE;
00746 zzBLOCK(zztasp1);
00747 zzMake0;
00748 {
00749 Expression *arg;
00750 _retv = 0;
00751 if ( (LA(1)==33) ) {
00752 {
00753 zzBLOCK(zztasp2);
00754 zzMake0;
00755 {
00756 zzmatch(33); zzCONSUME;
00757 arg = parser_expr140( symtab );
00758
00759
00760 _retv = not(arg);
00761 zzEXIT(zztasp2);
00762 }
00763 }
00764 }
00765 else {
00766 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST ||
00767 LA(1)==QUOTE_CHAR_CST || LA(1)==41 || LA(1)==42 || LA(1)==46 || LA(1)==50 ||
00768 LA(1)==51 || LA(1)==FORTRAN_ID) ) {
00769 _retv = parser_expr150( symtab );
00770
00771 }
00772 else {zzFAIL(1,zzerr3,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
00773 }
00774 zzEXIT(zztasp1);
00775 return _retv;
00776 fail:
00777 zzEXIT(zztasp1);
00778 zzsyn(zzMissText, zzBadTok, "Fortran .NOT. expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00779 zzresynch(setwd1, 0x40);
00780 return _retv;
00781 }
00782 }
00783
00784 Expression *
00785 #ifdef __STDC__
00786 parser_expr150( Symtab &symtab )
00787 #else
00788 parser_expr150(symtab)
00789 Symtab &symtab ;
00790 #endif
00791 {
00792 Expression * _retv;
00793 zzRULE;
00794 zzBLOCK(zztasp1);
00795 zzMake0;
00796 {
00797 Expression *arg; OP_TYPE op; Boolean rel_op_found = False;
00798 _retv = 0;
00799 _retv = parser_expr160( symtab );
00800
00801 {
00802 zzBLOCK(zztasp2);
00803 zzMake0;
00804 {
00805 while ( (LA(1)==34 || LA(1)==35 || LA(1)==36 ||
00806 LA(1)==37 || LA(1)==38 || LA(1)==39) ) {
00807 {
00808 zzBLOCK(zztasp3);
00809 zzMake0;
00810 {
00811 if ( (LA(1)==34) ) {
00812 zzmatch(34);
00813 op = LT_OP;
00814 zzCONSUME;
00815 }
00816 else {
00817 if ( (LA(1)==35) ) {
00818 zzmatch(35);
00819 op = LE_OP;
00820 zzCONSUME;
00821 }
00822 else {
00823 if ( (
00824 LA(1)==36) ) {
00825 zzmatch(36);
00826 op = EQ_OP;
00827 zzCONSUME;
00828 }
00829 else {
00830 if ( (LA(1)==37) ) {
00831 zzmatch(37);
00832 op = NE_OP;
00833 zzCONSUME;
00834 }
00835 else {
00836 if ( (LA(1)==38) ) {
00837 zzmatch(38);
00838 op = GT_OP;
00839 zzCONSUME;
00840 }
00841 else {
00842 if ( (LA(1)==39) ) {
00843 zzmatch(39);
00844 op = GE_OP;
00845 zzCONSUME;
00846 }
00847 else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
00848 }
00849 }
00850 }
00851 }
00852 }
00853 zzEXIT(zztasp3);
00854 }
00855 }
00856 arg = parser_expr160( symtab );
00857
00858
00859 if (arg) {
00860 if (rel_op_found) {
00861 parse_error("Fortran relative operators "
00862 "(e.g. .EQ.) are not associative");
00863 delete arg;
00864 }
00865 else {
00866 _retv = new BinaryExpr(op,
00867 expr_type(op, _retv->type(),
00868 arg->type()),
00869 _retv, arg);
00870 rel_op_found = True;
00871 }
00872 }
00873 zzLOOP(zztasp2);
00874 }
00875 zzEXIT(zztasp2);
00876 }
00877 }
00878 zzEXIT(zztasp1);
00879 return _retv;
00880 fail:
00881 zzEXIT(zztasp1);
00882 zzsyn(zzMissText, zzBadTok, "Fortran relational expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00883 zzresynch(setwd1, 0x80);
00884 return _retv;
00885 }
00886 }
00887
00888 Expression *
00889 #ifdef __STDC__
00890 parser_expr160( Symtab &symtab )
00891 #else
00892 parser_expr160(symtab)
00893 Symtab &symtab ;
00894 #endif
00895 {
00896 Expression * _retv;
00897 zzRULE;
00898 zzBLOCK(zztasp1);
00899 zzMake0;
00900 {
00901 Expression *arg; TreeBuilder *tree = new TreeBuilder;
00902 _retv = 0;
00903 arg = parser_arithmetic_expr( symtab );
00904
00905
00906 tree->left_arg(arg);
00907 {
00908 zzBLOCK(zztasp2);
00909 zzMake0;
00910 {
00911 while ( (LA(1)==40) ) {
00912 zzmatch(40); zzCONSUME;
00913 arg = parser_arithmetic_expr( symtab );
00914
00915
00916 tree->add_arg(CONCAT_OP, ASSOCIATIVE_OP, arg);
00917 zzLOOP(zztasp2);
00918 }
00919 zzEXIT(zztasp2);
00920 }
00921 }
00922 _retv = tree->grab(); delete tree;
00923 zzEXIT(zztasp1);
00924 return _retv;
00925 fail:
00926 zzEXIT(zztasp1);
00927 zzsyn(zzMissText, zzBadTok, "Fortran concatentation (`/// ... ') expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
00928 zzresynch(setwd2, 0x1);
00929 return _retv;
00930 }
00931 }
00932
00933 Expression *
00934 #ifdef __STDC__
00935 parser_arithmetic_expr( Symtab &symtab )
00936 #else
00937 parser_arithmetic_expr(symtab)
00938 Symtab &symtab ;
00939 #endif
00940 {
00941 Expression * _retv;
00942 zzRULE;
00943 zzBLOCK(zztasp1);
00944 zzMake0;
00945 {
00946 Expression *arg; OP_TYPE op;
00947 TreeBuilder *tree = new TreeBuilder;
00948 ASSOC_BOOL assoc;
00949 _retv = 0;
00950 if ( (
00951 LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST || LA(1)==46 || LA(1)==50 ||
00952 LA(1)==51 || LA(1)==FORTRAN_ID) ) {
00953 arg = parser_expr_term( symtab );
00954
00955 tree->left_arg(arg);
00956 {
00957 zzBLOCK(zztasp2);
00958 zzMake0;
00959 {
00960 while ( (LA(1)==41 || LA(1)==42) ) {
00961 {
00962 zzBLOCK(zztasp3);
00963 zzMake0;
00964 {
00965 if ( (LA(1)==41) ) {
00966 zzmatch(41);
00967 op = ADD_OP; assoc = ASSOCIATIVE_OP;
00968 zzCONSUME;
00969 }
00970 else {
00971 if ( (
00972 LA(1)==42) ) {
00973 zzmatch(42);
00974 op = SUB_OP; assoc = NONASSOCIATIVE_OP;
00975 zzCONSUME;
00976 }
00977 else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
00978 }
00979 zzEXIT(zztasp3);
00980 }
00981 }
00982 arg = parser_expr_term( symtab );
00983
00984
00985 tree->add_arg(op, assoc, arg);
00986 zzLOOP(zztasp2);
00987 }
00988 zzEXIT(zztasp2);
00989 }
00990 }
00991 _retv = tree->grab(); delete tree;
00992 }
00993 else {
00994 if ( (LA(1)==41) ) {
00995 zzmatch(41); zzCONSUME;
00996 arg = parser_expr_term( symtab );
00997
00998 _retv = unary_plus(arg);
00999 }
01000 else {
01001 if ( (LA(1)==42) ) {
01002 zzmatch(42); zzCONSUME;
01003 arg = parser_expr_term( symtab );
01004
01005 _retv = unary_minus(arg);
01006 }
01007 else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01008 }
01009 }
01010 zzEXIT(zztasp1);
01011 return _retv;
01012 fail:
01013 zzEXIT(zztasp1);
01014 zzsyn(zzMissText, zzBadTok, "Fortran arithmetic expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
01015 zzresynch(setwd2, 0x2);
01016 return _retv;
01017 }
01018 }
01019
01020 Expression *
01021 #ifdef __STDC__
01022 parser_expr_term( Symtab &symtab )
01023 #else
01024 parser_expr_term(symtab)
01025 Symtab &symtab ;
01026 #endif
01027 {
01028 Expression * _retv;
01029 zzRULE;
01030 zzBLOCK(zztasp1);
01031 zzMake0;
01032 {
01033 Expression *arg; OP_TYPE op;
01034 TreeBuilder *tree = new TreeBuilder;
01035 ASSOC_BOOL assoc;
01036 _retv = 0;
01037 arg = parser_expr_factor( symtab );
01038
01039 tree->left_arg(arg);
01040 {
01041 zzBLOCK(zztasp2);
01042 zzMake0;
01043 {
01044 while ( (LA(1)==43 || LA(1)==44) ) {
01045 {
01046 zzBLOCK(zztasp3);
01047 zzMake0;
01048 {
01049 if ( (
01050 LA(1)==43) ) {
01051 zzmatch(43);
01052 op = MULT_OP; assoc = ASSOCIATIVE_OP;
01053 zzCONSUME;
01054 }
01055 else {
01056 if ( (LA(1)==44) ) {
01057 zzmatch(44);
01058 op = DIV_OP; assoc = NONASSOCIATIVE_OP;
01059 zzCONSUME;
01060 }
01061 else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01062 }
01063 zzEXIT(zztasp3);
01064 }
01065 }
01066 arg = parser_expr_factor( symtab );
01067
01068
01069 tree->add_arg(op, assoc, arg);
01070 zzLOOP(zztasp2);
01071 }
01072 zzEXIT(zztasp2);
01073 }
01074 }
01075 _retv = tree->grab(); delete tree;
01076 zzEXIT(zztasp1);
01077 return _retv;
01078 fail:
01079 zzEXIT(zztasp1);
01080 zzsyn(zzMissText, zzBadTok, "Fortran term", zzMissSet, zzMissTok, zzErrk, zzBadText);
01081 zzresynch(setwd2, 0x4);
01082 return _retv;
01083 }
01084 }
01085
01086 Expression *
01087 #ifdef __STDC__
01088 parser_expr_factor( Symtab &symtab )
01089 #else
01090 parser_expr_factor(symtab)
01091 Symtab &symtab ;
01092 #endif
01093 {
01094 Expression * _retv;
01095 zzRULE;
01096 zzBLOCK(zztasp1);
01097 zzMake0;
01098 {
01099 Expression *arg; TreeBuilder *tree = new TreeBuilder;
01100 _retv = 0;
01101 arg = parser_afi_expr( symtab );
01102
01103 tree->left_arg(arg);
01104 {
01105 zzBLOCK(zztasp2);
01106 zzMake0;
01107 {
01108 if ( (LA(1)==45) ) {
01109 zzmatch(45); zzCONSUME;
01110 arg = parser_expr_factor( symtab );
01111
01112
01113 tree->add_arg(EXP_OP, NONASSOCIATIVE_OP, arg);
01114 }
01115 zzEXIT(zztasp2);
01116 }
01117 }
01118 _retv = tree->grab(); delete tree;
01119 zzEXIT(zztasp1);
01120 return _retv;
01121 fail:
01122 zzEXIT(zztasp1);
01123 zzsyn(zzMissText, zzBadTok, "Fortran factor", zzMissSet, zzMissTok, zzErrk, zzBadText);
01124 zzresynch(setwd2, 0x8);
01125 return _retv;
01126 }
01127 }
01128
01129 Expression *
01130 #ifdef __STDC__
01131 parser_afi_expr( Symtab &symtab )
01132 #else
01133 parser_afi_expr(symtab)
01134 Symtab &symtab ;
01135 #endif
01136 {
01137 Expression * _retv;
01138 zzRULE;
01139 zzBLOCK(zztasp1);
01140 zzMake0;
01141 {
01142 Expression *arg = 0;
01143 _retv = 0;
01144 _retv = parser_expr_primary( symtab );
01145
01146 {
01147 zzBLOCK(zztasp2);
01148 zzMake0;
01149 {
01150 if ( (LA(1)==46) ) {
01151 {
01152 zzBLOCK(zztasp3);
01153 zzMake0;
01154 {
01155 zzmatch(46); zzCONSUME;
01156 arg = parser_afi_args( symtab );
01157
01158 zzmatch(47);
01159
01160 _retv = make_afi_node(_retv, arg);
01161
01162
01163
01164 arg = 0;
01165 zzCONSUME;
01166 zzEXIT(zztasp3);
01167 }
01168 }
01169 }
01170 zzEXIT(zztasp2);
01171 }
01172 }
01173 zzEXIT(zztasp1);
01174 return _retv;
01175 fail:
01176 zzEXIT(zztasp1);
01177 if (arg) { delete arg; }
01178 zzsyn(zzMissText, zzBadTok, "Fortran array ref/func call/substring expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
01179 zzresynch(setwd2, 0x10);
01180 return _retv;
01181 }
01182 }
01183
01184 Expression *
01185 #ifdef __STDC__
01186 parser_expr_primary( Symtab &symtab )
01187 #else
01188 parser_expr_primary(symtab)
01189 Symtab &symtab ;
01190 #endif
01191 {
01192 Expression * _retv;
01193 zzRULE;
01194 zzBLOCK(zztasp1);
01195 zzMake0;
01196 {
01197 Expression *arg1 = 0;
01198 _retv = 0;
01199 if ( (LA(1)==F_NUM_CONST ||
01200 LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST || LA(1)==50 || LA(1)==51) ) {
01201 _retv = parser_fortran_constant();
01202
01203 }
01204 else {
01205 if ( (LA(1)==FORTRAN_ID) ) {
01206 _retv = parser_sym_ref( symtab );
01207
01208 }
01209 else {
01210 if ( (
01211 LA(1)==46) ) {
01212 zzmatch(46); zzCONSUME;
01213 arg1 = parser_expression( symtab );
01214
01215 zzmatch(47);
01216 _retv = arg1; arg1 = 0;
01217 zzCONSUME;
01218 }
01219 else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01220 }
01221 }
01222 zzEXIT(zztasp1);
01223 return _retv;
01224 fail:
01225 zzEXIT(zztasp1);
01226 if (arg1) delete arg1;
01227 zzsyn(zzMissText, zzBadTok, "Fortran expression term", zzMissSet, zzMissTok, zzErrk, zzBadText);
01228 zzresynch(setwd2, 0x20);
01229 return _retv;
01230 }
01231 }
01232
01233 Expression *
01234 #ifdef __STDC__
01235 parser_afi_args( Symtab &symtab )
01236 #else
01237 parser_afi_args(symtab)
01238 Symtab &symtab ;
01239 #endif
01240 {
01241 Expression * _retv;
01242 zzRULE;
01243 zzBLOCK(zztasp1);
01244 zzMake0;
01245 {
01246 _retv = 0;
01247 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST || LA(1)==33 ||
01248 LA(1)==41 || LA(1)==42 || LA(1)==46 || LA(1)==49 || LA(1)==50 ||
01249 LA(1)==51 || LA(1)==FORTRAN_ID) ) {
01250 _retv = parser_comma_args_expr( symtab );
01251
01252 }
01253 else {
01254 if ( (LA(1)==47) ) {
01255
01256 _retv = comma(new ExpressionList);
01257 }
01258 else {zzFAIL(1,zzerr9,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01259 }
01260 zzEXIT(zztasp1);
01261 return _retv;
01262 fail:
01263 zzEXIT(zztasp1);
01264 zzsyn(zzMissText, zzBadTok, "arguments to array reference or function/intrinsic call", zzMissSet, zzMissTok, zzErrk, zzBadText);
01265 zzresynch(setwd2, 0x40);
01266 return _retv;
01267 }
01268 }
01269
01270 Expression *
01271 #ifdef __STDC__
01272 parser_comma_args_expr( Symtab &symtab )
01273 #else
01274 parser_comma_args_expr(symtab)
01275 Symtab &symtab ;
01276 #endif
01277 {
01278 Expression * _retv;
01279 zzRULE;
01280 zzBLOCK(zztasp1);
01281 zzMake0;
01282 {
01283 Expression *arg;
01284 ExpressionList *list =
01285 new ExpressionList;
01286 arg = parser_triplet( symtab );
01287
01288 list->ins_last(arg);
01289 {
01290 zzBLOCK(zztasp2);
01291 zzMake0;
01292 {
01293 while ( (LA(1)==48) ) {
01294 zzmatch(48); zzCONSUME;
01295 arg = parser_triplet( symtab );
01296
01297
01298 list->ins_last(arg);
01299 zzLOOP(zztasp2);
01300 }
01301 zzEXIT(zztasp2);
01302 }
01303 }
01304 _retv = comma(list); list = 0;
01305 zzEXIT(zztasp1);
01306 return _retv;
01307 fail:
01308 zzEXIT(zztasp1);
01309 if (list) { delete list; }
01310 zzsyn(zzMissText, zzBadTok, "comma-separated (triplet) expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
01311 zzresynch(setwd2, 0x80);
01312 return _retv;
01313 }
01314 }
01315
01316 Expression *
01317 #ifdef __STDC__
01318 parser_triplet( Symtab &symtab )
01319 #else
01320 parser_triplet(symtab)
01321 Symtab &symtab ;
01322 #endif
01323 {
01324 Expression * _retv;
01325 zzRULE;
01326 zzBLOCK(zztasp1);
01327 zzMake0;
01328 {
01329 _retv = parser_colon_expr( symtab );
01330
01331 zzEXIT(zztasp1);
01332 return _retv;
01333 fail:
01334 zzEXIT(zztasp1);
01335 zzsyn(zzMissText, zzBadTok, "triplet or argument expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
01336 zzresynch(setwd3, 0x1);
01337 return _retv;
01338 }
01339 }
01340
01341 Expression *
01342 #ifdef __STDC__
01343 parser_colon_expr( Symtab &symtab )
01344 #else
01345 parser_colon_expr(symtab)
01346 Symtab &symtab ;
01347 #endif
01348 {
01349 Expression * _retv;
01350 zzRULE;
01351 zzBLOCK(zztasp1);
01352 zzMake0;
01353 {
01354 _retv = 0;
01355 Expression *exprs[3] = { 0, 0, 0 };
01356 Boolean is_triplet = False;
01357 parser_colon_expr_aux( symtab, exprs, is_triplet );
01358
01359 if (!is_triplet) {
01360
01361 p_assert(exprs[1] == 0 && exprs[2] == 0,
01362 "Internal Error");
01363 _retv = exprs[0]; exprs[0] = 0;
01364 }
01365 else {
01366
01367
01368
01369
01370
01371 _retv = ::colon( (exprs[0] ? exprs[0] : omega()),
01372 (exprs[1] ? exprs[1] : omega()),
01373 (exprs[2] ? exprs[2] : 0) );
01374 exprs[0] = exprs[1] = exprs[2] = 0;
01375 }
01376 zzEXIT(zztasp1);
01377 return _retv;
01378 fail:
01379 zzEXIT(zztasp1);
01380 for (int j = 0; j < 3; ++j) if (exprs[j]) delete exprs[j];
01381 zzsyn(zzMissText, zzBadTok, "colon-seperated expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
01382 zzresynch(setwd3, 0x2);
01383 return _retv;
01384 }
01385 }
01386
01387 void
01388 #ifdef __STDC__
01389 parser_colon_expr_aux( Symtab &symtab,
01390 Expression *exprs[3],
01391 Boolean &is_triplet )
01392 #else
01393 parser_colon_expr_aux(symtab,3,is_triplet)
01394 Symtab &symtab;
01395 Expression *exprs[3];
01396 Boolean &is_triplet ;
01397 #endif
01398 {
01399 zzRULE;
01400 zzBLOCK(zztasp1);
01401 zzMake0;
01402 {
01403 if ( (LA(1)==F_NUM_CONST ||
01404 LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 || LA(1)==42 ||
01405 LA(1)==46 || LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
01406 exprs[0] = parser_expression( symtab );
01407
01408 {
01409 zzBLOCK(zztasp2);
01410 zzMake0;
01411 {
01412 if ( (LA(1)==49) ) {
01413 zzmatch(49);
01414 is_triplet = True;
01415 zzCONSUME;
01416 {
01417 zzBLOCK(zztasp3);
01418 zzMake0;
01419 {
01420 if ( (
01421 LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 ||
01422 LA(1)==42 || LA(1)==46 || LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
01423 exprs[1] = parser_expression( symtab );
01424
01425 }
01426 zzEXIT(zztasp3);
01427 }
01428 }
01429 {
01430 zzBLOCK(zztasp3);
01431 zzMake0;
01432 {
01433 if ( (
01434 LA(1)==49) ) {
01435 zzmatch(49); zzCONSUME;
01436 exprs[2] = parser_expression( symtab );
01437
01438 }
01439 zzEXIT(zztasp3);
01440 }
01441 }
01442 }
01443 zzEXIT(zztasp2);
01444 }
01445 }
01446 }
01447 else {
01448 if ( (LA(1)==49) ) {
01449 zzmatch(49);
01450 is_triplet = True;
01451 zzCONSUME;
01452 {
01453 zzBLOCK(zztasp2);
01454 zzMake0;
01455 {
01456 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST ||
01457 LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 || LA(1)==50 ||
01458 LA(1)==51 || LA(1)==FORTRAN_ID) ) {
01459 exprs[1] = parser_expression( symtab );
01460
01461 }
01462 zzEXIT(zztasp2);
01463 }
01464 }
01465 {
01466 zzBLOCK(zztasp2);
01467 zzMake0;
01468 {
01469 if ( (LA(1)==49) ) {
01470 zzmatch(49); zzCONSUME;
01471 exprs[2] = parser_expression( symtab );
01472
01473 }
01474 zzEXIT(zztasp2);
01475 }
01476 }
01477 }
01478 else {zzFAIL(1,zzerr10,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01479 }
01480 zzEXIT(zztasp1);
01481 return;
01482 fail:
01483 zzEXIT(zztasp1);
01484 zzsyn(zzMissText, zzBadTok, "colon-separated expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
01485 zzresynch(setwd3, 0x4);
01486 }
01487 }
01488
01489 Expression *
01490 #ifdef __STDC__
01491 parser_fortran_constant(void)
01492 #else
01493 parser_fortran_constant()
01494 #endif
01495 {
01496 Expression * _retv;
01497 zzRULE;
01498 zzBLOCK(zztasp1);
01499 zzMake0;
01500 {
01501 _retv = 0;
01502 if ( (LA(1)==50) ) {
01503 zzmatch(50);
01504 _retv = new LogicalConstExpr(".TRUE.");
01505 zzCONSUME;
01506 }
01507 else {
01508 if ( (LA(1)==51) ) {
01509 zzmatch(51);
01510 _retv = new LogicalConstExpr(".FALSE.");
01511 zzCONSUME;
01512 }
01513 else {
01514 if ( (
01515 LA(1)==APOST_CHAR_CST) ) {
01516 zzmatch(APOST_CHAR_CST);
01517 _retv = new StringConstExpr(strip_outer_quotes(zzaArg(zztasp1,1 ).text));
01518 zzCONSUME;
01519 }
01520 else {
01521 if ( (LA(1)==QUOTE_CHAR_CST) ) {
01522 zzmatch(QUOTE_CHAR_CST);
01523 _retv = constant(zzaArg(zztasp1,1 ).text);
01524 zzCONSUME;
01525 }
01526 else {
01527 if ( (LA(1)==F_NUM_CONST) ) {
01528 zzmatch(F_NUM_CONST);
01529
01530 Type type = string_type(zzaArg(zztasp1,1 ).text, True);
01531 switch(type.data_type()) {
01532 case UNDEFINED_TYPE:
01533 {
01534 String msg = "Malformed Fortran numeric constant `";
01535 msg += zzaArg(zztasp1,1 ).text;
01536 msg += "'";
01537 parse_error(msg);
01538 _retv = constant(0);
01539 }
01540 break;
01541
01542 case INTEGER_TYPE:
01543 _retv = constant(zzaArg(zztasp1,1 ).text);
01544 break;
01545
01546 case REAL_TYPE:
01547 _retv = new RealConstExpr(REAL_TYPE, zzaArg(zztasp1,1 ).text);
01548 break;
01549
01550 case DOUBLE_PRECISION_TYPE:
01551 _retv = new RealConstExpr(DOUBLE_PRECISION_TYPE, zzaArg(zztasp1,1 ).text);
01552 break;
01553
01554 default:
01555 p_abort("Internal Error: Fortran numeric "
01556 "constant returned non-numeric type");
01557 break;
01558 }
01559 zzCONSUME;
01560 }
01561 else {zzFAIL(1,zzerr11,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
01562 }
01563 }
01564 }
01565 }
01566 zzEXIT(zztasp1);
01567 return _retv;
01568 fail:
01569 zzEXIT(zztasp1);
01570 zzsyn(zzMissText, zzBadTok, "Fortran constant", zzMissSet, zzMissTok, zzErrk, zzBadText);
01571 zzresynch(setwd3, 0x8);
01572 return _retv;
01573 }
01574 }
01575
01576 Expression *
01577 #ifdef __STDC__
01578 parser_sym_ref( Symtab &symtab )
01579 #else
01580 parser_sym_ref(symtab)
01581 Symtab &symtab ;
01582 #endif
01583 {
01584 Expression * _retv;
01585 zzRULE;
01586 zzBLOCK(zztasp1);
01587 zzMake0;
01588 {
01589 zzmatch(FORTRAN_ID);
01590 {
01591 const char *name = zzaArg(zztasp1,1 ).text;
01592 Symbol *sym = symtab.find_ref(name);
01593
01594 if (sym)
01595 _retv = id(*sym);
01596 else {
01597 _retv = constant(0);
01598 String msg = (String)"Undefined Fortran symbol `"
01599 + name + "'";
01600 parse_error(msg);
01601 }
01602 }
01603 zzCONSUME;
01604 zzEXIT(zztasp1);
01605 return _retv;
01606 fail:
01607 zzEXIT(zztasp1);
01608 zzsyn(zzMissText, zzBadTok, "Fortran symbol reference", zzMissSet, zzMissTok, zzErrk, zzBadText);
01609 zzresynch(setwd3, 0x10);
01610 return _retv;
01611 }
01612 }
01613
01614 ExpressionList *
01615 #ifdef __STDC__
01616 parser_expr_list_with_commas( Symtab &symtab )
01617 #else
01618 parser_expr_list_with_commas(symtab)
01619 Symtab &symtab ;
01620 #endif
01621 {
01622 ExpressionList * _retv;
01623 zzRULE;
01624 zzBLOCK(zztasp1);
01625 zzMake0;
01626 {
01627 Expression *e = 0;
01628 _retv = new ExpressionList;
01629 e = parser_expression( symtab );
01630
01631
01632 if (e)
01633 _retv->ins_last(e);
01634 {
01635 zzBLOCK(zztasp2);
01636 zzMake0;
01637 {
01638 while ( (LA(1)==48) ) {
01639 zzmatch(48); zzCONSUME;
01640 e = parser_expression( symtab );
01641
01642
01643 if (e)
01644 _retv->ins_last(e);
01645 zzLOOP(zztasp2);
01646 }
01647 zzEXIT(zztasp2);
01648 }
01649 }
01650 zzEXIT(zztasp1);
01651 return _retv;
01652 fail:
01653 zzEXIT(zztasp1);
01654 zzsyn(zzMissText, zzBadTok, "Expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
01655 zzresynch(setwd3, 0x20);
01656 return _retv;
01657 }
01658 }
01659
01660 ExpressionList *
01661 #ifdef __STDC__
01662 parser_lvalue_list_with_commas( Symtab &symtab )
01663 #else
01664 parser_lvalue_list_with_commas(symtab)
01665 Symtab &symtab ;
01666 #endif
01667 {
01668 ExpressionList * _retv;
01669 zzRULE;
01670 zzBLOCK(zztasp1);
01671 zzMake0;
01672 {
01673 _retv = parser_expr_list_with_commas( symtab );
01674
01675
01676 validate_expr_list_types(*_retv,
01677 "scalar variable or array reference",
01678 True,
01679 True,
01680 True
01681 );
01682 zzEXIT(zztasp1);
01683 return _retv;
01684 fail:
01685 zzEXIT(zztasp1);
01686 zzsyn(zzMissText, zzBadTok, "List of Variables/Array Elements", zzMissSet, zzMissTok, zzErrk, zzBadText);
01687 zzresynch(setwd3, 0x40);
01688 return _retv;
01689 }
01690 }
01691
01692 Symbol *
01693 #ifdef __STDC__
01694 parser_scalar_var( ParserContext &context )
01695 #else
01696 parser_scalar_var(context)
01697 ParserContext &context ;
01698 #endif
01699 {
01700 Symbol * _retv;
01701 zzRULE;
01702 zzBLOCK(zztasp1);
01703 zzMake0;
01704 {
01705
01706 Expression *e = 0;
01707 _retv = 0;
01708 e = parser_expression( context.pgm.symtab() );
01709
01710
01711 if (!is_scalar_var(*e)) {
01712 ostrstream s;
01713 s << "Expected scalar variable but found: "
01714 << *e << endl;
01715 char *str = s.str();
01716 parse_error(str);
01717 delete [] str;
01718
01719 delete e;
01720 }
01721 else {
01722 Symbol &sym = e->symbol();
01723 delete e;
01724 return &sym;
01725 }
01726 zzEXIT(zztasp1);
01727 return _retv;
01728 fail:
01729 zzEXIT(zztasp1);
01730 zzsyn(zzMissText, zzBadTok, "scalar variable", zzMissSet, zzMissTok, zzErrk, zzBadText);
01731 zzresynch(setwd3, 0x80);
01732 return _retv;
01733 }
01734 }
01735
01736 void
01737 #ifdef __STDC__
01738 parser_generic_private( ParserContext &context )
01739 #else
01740 parser_generic_private(context)
01741 ParserContext &context ;
01742 #endif
01743 {
01744 zzRULE;
01745 zzBLOCK(zztasp1);
01746 zzMake0;
01747 {
01748
01749 ExpressionList *lvalues = 0;
01750 Statement *s = 0;
01751 AssertPrivate *a = 0;
01752 zzmatch(53);
01753 a = 0;
01754 s = enclosing_scope( context.s_next );
01755
01756 if (s != 0) {
01757
01758 a = (AssertPrivate *)
01759 assertion_of_type( s->assertions(),
01760 AS_PRIVATE );
01761 if (a == 0) {
01762 a = new AssertPrivate;
01763 s->assertions().ins_last( a );
01764 }
01765 }
01766 else {
01767 parse_error("PRIVATE is not within a DO loop or "
01768 "BLOCK ENTRY scope");
01769 }
01770 zzCONSUME;
01771 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
01772
01773 zzmatch(1);
01774
01775 if (a != 0)
01776 list_absorb(a->arg_list_guarded(), lvalues);
01777 else
01778 delete lvalues;
01779 zzCONSUME;
01780 zzEXIT(zztasp1);
01781 return;
01782 fail:
01783 zzEXIT(zztasp1);
01784 zzsyn(zzMissText, zzBadTok, "PRIVATE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
01785 zzresynch(setwd4, 0x1);
01786 }
01787 }
01788
01789 void
01790 #ifdef __STDC__
01791 parser_generic_assert( ParserContext &context )
01792 #else
01793 parser_generic_assert(context)
01794 ParserContext &context ;
01795 #endif
01796 {
01797 zzRULE;
01798 zzBLOCK(zztasp1);
01799 zzMake0;
01800 {
01801
01802 ExpressionList *ex_list = 0;
01803 Statement *s = 0;
01804 AssertRelation *a = 0;
01805 zzmatch(54);
01806 a = 0;
01807 s = &context.s_next;
01808
01809 if (s != 0) {
01810
01811 a = (AssertRelation *)
01812 assertion_of_type( s->assertions(),
01813 AS_RELATION );
01814 if (a == 0) {
01815 a = new AssertRelation;
01816 s->assertions().ins_last( a );
01817 }
01818 }
01819 zzCONSUME;
01820 ex_list = parser_expr_list_with_commas( context.pgm.symtab() );
01821
01822 zzmatch(1);
01823
01824 if (a != 0)
01825 list_absorb(a->arg_list_guarded(), ex_list);
01826 else
01827 delete ex_list;
01828 zzCONSUME;
01829 zzEXIT(zztasp1);
01830 return;
01831 fail:
01832 zzEXIT(zztasp1);
01833 zzsyn(zzMissText, zzBadTok, "ASSERT directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
01834 zzresynch(setwd4, 0x2);
01835 }
01836 }
01837
01838 void
01839 #ifdef __STDC__
01840 parser_generic_safe_condition( ParserContext &context )
01841 #else
01842 parser_generic_safe_condition(context)
01843 ParserContext &context ;
01844 #endif
01845 {
01846 zzRULE;
01847 zzBLOCK(zztasp1);
01848 zzMake0;
01849 {
01850
01851 ExpressionList *ex_list = 0;
01852 Statement *s = 0;
01853 AssertSafeCondition *a = 0;
01854 zzmatch(55);
01855 a = 0;
01856 s = &context.s_next;
01857
01858 if (s != 0) {
01859
01860 a = (AssertSafeCondition *)
01861 assertion_of_type( s->assertions(),
01862 AS_SAFE_CONDITION );
01863 if (a == 0) {
01864 a = new AssertSafeCondition;
01865 s->assertions().ins_last( a );
01866 }
01867 }
01868 zzCONSUME;
01869 ex_list = parser_expr_list_with_commas( context.pgm.symtab() );
01870
01871 zzmatch(1);
01872
01873 if (a != 0)
01874 list_absorb(a->arg_list_guarded(), ex_list);
01875 else
01876 delete ex_list;
01877 zzCONSUME;
01878 zzEXIT(zztasp1);
01879 return;
01880 fail:
01881 zzEXIT(zztasp1);
01882 zzsyn(zzMissText, zzBadTok, "SAFE_CONDITION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
01883 zzresynch(setwd4, 0x4);
01884 }
01885 }
01886
01887 void
01888 #ifdef __STDC__
01889 parser_generic_begin_parallel( ParserContext &context )
01890 #else
01891 parser_generic_begin_parallel(context)
01892 ParserContext &context ;
01893 #endif
01894 {
01895 zzRULE;
01896 zzBLOCK(zztasp1);
01897 zzMake0;
01898 {
01899
01900 Symbol *scalar = 0;
01901 AssertPrologue *as_pro = 0;
01902 AssertParallel *as_par = 0;
01903 Statement *s = 0;
01904 Statement *s_do = 0;
01905 zzmatch(56); zzCONSUME;
01906 zzmatch(46); zzCONSUME;
01907 scalar = parser_scalar_var( context );
01908
01909 zzmatch(47); zzCONSUME;
01910 zzmatch(1);
01911
01912 as_pro = new AssertPrologue;
01913 as_pro->arg_list_guarded().ins_last( id(*scalar) );
01914
01915 context.s_next.assertions().ins_last( as_pro );
01916
01917
01918 for (s = &context.s_next; s != 0; s = s->next_ref()) {
01919 if (s->stmt_class() == DO_STMT) {
01920 if (&s->index().symbol() == scalar) {
01921 s_do = s;
01922 break;
01923 }
01924 s = s->follow_ref();
01925 p_assert( s->stmt_class() == ENDDO_STMT,
01926 "not a DO loop" );
01927 }
01928 }
01929
01930 if (s_do != 0) {
01931 as_par = (AssertParallel *)
01932 assertion_of_type(s_do->assertions(), AS_PARALLEL);
01933
01934 if (as_par == 0) {
01935 as_par = new AssertParallel;
01936 s_do->assertions().ins_first( as_par );
01937 as_par->arg_list_guarded().ins_first( id(*scalar) );
01938 }
01939
01940 as_par->assertion_list().ins_last( *as_pro );
01941 as_pro->assertion_list().ins_last( *as_par );
01942 }
01943 else {
01944 parse_error("BEGIN PARALLEL: Could not find specified "
01945 "DO loop");
01946 }
01947 zzCONSUME;
01948 zzEXIT(zztasp1);
01949 return;
01950 fail:
01951 zzEXIT(zztasp1);
01952 zzsyn(zzMissText, zzBadTok, "BEGIN PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
01953 zzresynch(setwd4, 0x8);
01954 }
01955 }
01956
01957 void
01958 #ifdef __STDC__
01959 parser_generic_end_parallel( ParserContext &context )
01960 #else
01961 parser_generic_end_parallel(context)
01962 ParserContext &context ;
01963 #endif
01964 {
01965 zzRULE;
01966 zzBLOCK(zztasp1);
01967 zzMake0;
01968 {
01969
01970 Symbol *scalar = 0;
01971 AssertEpilogue *as_epi = 0;
01972 AssertParallel *as_par = 0;
01973 Statement *s = 0;
01974 Statement *s_do = 0;
01975 zzmatch(56); zzCONSUME;
01976 zzmatch(46); zzCONSUME;
01977 scalar = parser_scalar_var( context );
01978
01979 zzmatch(47); zzCONSUME;
01980 zzmatch(1);
01981
01982 as_epi = new AssertEpilogue;
01983 as_epi->arg_list_guarded().ins_last( id(*scalar) );
01984
01985 context.s_next.prev_ref()->assertions().ins_last(as_epi);
01986
01987
01988
01989 for (s = context.s_next.prev_ref(); s != 0;
01990 s = s->prev_ref()) {
01991 if (s->stmt_class() == ENDDO_STMT) {
01992 s = s->follow_ref();
01993 if (s->stmt_class() == DO_STMT) {
01994 if (&s->index().symbol() == scalar) {
01995 s_do = s;
01996 break;
01997 }
01998 }
01999 }
02000 }
02001
02002 if (s_do != 0) {
02003 as_par = (AssertParallel *)
02004 assertion_of_type(s_do->assertions(), AS_PARALLEL);
02005
02006 if (as_par == 0) {
02007 as_par = new AssertParallel;
02008 s_do->assertions().ins_first( as_par );
02009 as_par->arg_list_guarded().ins_first( id(*scalar) );
02010 }
02011
02012 as_par->assertion_list().ins_last( *as_epi );
02013 as_epi->assertion_list().ins_last( *as_par );
02014 }
02015 else {
02016 parse_error("END PARALLEL: Could not find specified "
02017 "DO loop");
02018 }
02019 zzCONSUME;
02020 zzEXIT(zztasp1);
02021 return;
02022 fail:
02023 zzEXIT(zztasp1);
02024 zzsyn(zzMissText, zzBadTok, "END PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02025 zzresynch(setwd4, 0x10);
02026 }
02027 }
02028
02029 void
02030 #ifdef __STDC__
02031 parser_generic_begin_block( ParserContext &context )
02032 #else
02033 parser_generic_begin_block(context)
02034 ParserContext &context ;
02035 #endif
02036 {
02037 zzRULE;
02038 zzBLOCK(zztasp1);
02039 zzMake0;
02040 {
02041 Statement *s = 0;
02042 Statement *prev_stmt = 0;
02043 zzmatch(57); zzCONSUME;
02044 zzmatch(1);
02045
02046 s = new BlockEntryStmt( context.pgm.stmts().new_tag() );
02047
02048 prev_stmt = context.s_next.prev_ref();
02049
02050 if (prev_stmt->stmt_class() == IMPLIED_GOTO_STMT) {
02051 prev_stmt = prev_stmt->prev_ref();
02052 };
02053
02054
02055
02056
02057 Directive::_ins_after(context.pgm.stmts(),
02058 s, prev_stmt,
02059 "BLOCK_ENTRY" );
02060 zzCONSUME;
02061 zzEXIT(zztasp1);
02062 return;
02063 fail:
02064 zzEXIT(zztasp1);
02065 zzsyn(zzMissText, zzBadTok, "BEGIN BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02066 zzresynch(setwd4, 0x20);
02067 }
02068 }
02069
02070 void
02071 #ifdef __STDC__
02072 parser_generic_instrument( ParserContext &context )
02073 #else
02074 parser_generic_instrument(context)
02075 ParserContext &context ;
02076 #endif
02077 {
02078 zzRULE;
02079 zzBLOCK(zztasp1);
02080 zzMake0;
02081 {
02082 Statement *s = 0;
02083 AssertInstrument *a = 0;
02084 IntConstExpr *arg = 0;
02085 {
02086 zzBLOCK(zztasp2);
02087 zzMake0;
02088 {
02089 if ( (LA(1)==58) ) {
02090 zzmatch(58);
02091 arg = new IntConstExpr(1);
02092 zzCONSUME;
02093 }
02094 else {
02095 if ( (
02096 LA(1)==59) ) {
02097 zzmatch(59);
02098 arg = new IntConstExpr(2);
02099 zzCONSUME;
02100 }
02101 else {
02102 if ( (LA(1)==60) ) {
02103 zzmatch(60); zzCONSUME;
02104 }
02105 else {zzFAIL(1,zzerr12,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
02106 }
02107 }
02108 zzEXIT(zztasp2);
02109 }
02110 }
02111 zzmatch(1);
02112
02113 s = &context.s_next;
02114
02115 a = new AssertInstrument;
02116 if(arg) a->arg_list_guarded().ins_last(arg);
02117 s->assertions().ins_last( a );
02118 zzCONSUME;
02119 zzEXIT(zztasp1);
02120 return;
02121 fail:
02122 zzEXIT(zztasp1);
02123 zzsyn(zzMissText, zzBadTok, "INSTRUMENT directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02124 zzresynch(setwd4, 0x40);
02125 }
02126 }
02127
02128 void
02129 #ifdef __STDC__
02130 parser_generic_rtshadow( ParserContext &context )
02131 #else
02132 parser_generic_rtshadow(context)
02133 ParserContext &context ;
02134 #endif
02135 {
02136 zzRULE;
02137 zzBLOCK(zztasp1);
02138 zzMake0;
02139 {
02140
02141 ExpressionList *lvalues = 0;
02142 Statement *s = 0;
02143 AssertRTShadow *a = 0;
02144 zzmatch(61);
02145 a = new AssertRTShadow;
02146 context.s_next.assertions().ins_last( a );
02147 zzCONSUME;
02148 {
02149 zzBLOCK(zztasp2);
02150 zzMake0;
02151 {
02152 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST || LA(1)==QUOTE_CHAR_CST ||
02153 LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 || LA(1)==50 ||
02154 LA(1)==51 || LA(1)==FORTRAN_ID) ) {
02155 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02156
02157 }
02158 zzEXIT(zztasp2);
02159 }
02160 }
02161 zzmatch(1);
02162
02163 if (a != 0)
02164 list_absorb(a->arg_list_guarded(), lvalues);
02165 else
02166 delete lvalues;
02167 zzCONSUME;
02168 zzEXIT(zztasp1);
02169 return;
02170 fail:
02171 zzEXIT(zztasp1);
02172 zzsyn(zzMissText, zzBadTok, "RTSHADOW directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02173 zzresynch(setwd4, 0x80);
02174 }
02175 }
02176
02177 void
02178 #ifdef __STDC__
02179 parser_generic_depio( ParserContext &context )
02180 #else
02181 parser_generic_depio(context)
02182 ParserContext &context ;
02183 #endif
02184 {
02185 zzRULE;
02186 zzBLOCK(zztasp1);
02187 zzMake0;
02188 {
02189 Statement *s = 0;
02190 AssertDepIO *a = 0;
02191 zzmatch(62); zzCONSUME;
02192 zzmatch(1);
02193
02194 s = &context.s_next;
02195
02196 a = new AssertDepIO;
02197 s->assertions().ins_last( a );
02198 zzCONSUME;
02199 zzEXIT(zztasp1);
02200 return;
02201 fail:
02202 zzEXIT(zztasp1);
02203 zzsyn(zzMissText, zzBadTok, "DEPIO directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02204 zzresynch(setwd5, 0x1);
02205 }
02206 }
02207
02208 void
02209 #ifdef __STDC__
02210 parser_generic_inline( ParserContext &context )
02211 #else
02212 parser_generic_inline(context)
02213 ParserContext &context ;
02214 #endif
02215 {
02216 zzRULE;
02217 zzBLOCK(zztasp1);
02218 zzMake0;
02219 {
02220 Statement *s = 0;
02221 AssertInline *a = 0;
02222 zzmatch(63); zzCONSUME;
02223 zzmatch(1);
02224
02225 s = &context.s_next;
02226
02227 a = new AssertInline;
02228 s->assertions().ins_last( a );
02229 zzCONSUME;
02230 zzEXIT(zztasp1);
02231 return;
02232 fail:
02233 zzEXIT(zztasp1);
02234 zzsyn(zzMissText, zzBadTok, "INLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02235 zzresynch(setwd5, 0x2);
02236 }
02237 }
02238
02239 void
02240 #ifdef __STDC__
02241 parser_generic_recursive_inline( ParserContext &context )
02242 #else
02243 parser_generic_recursive_inline(context)
02244 ParserContext &context ;
02245 #endif
02246 {
02247 zzRULE;
02248 zzBLOCK(zztasp1);
02249 zzMake0;
02250 {
02251 Statement *s = 0;
02252 AssertRecursiveInline *a = 0;
02253 zzmatch(64); zzCONSUME;
02254 zzmatch(1);
02255
02256 s = &context.s_next;
02257
02258 a = new AssertRecursiveInline;
02259 s->assertions().ins_last( a );
02260 zzCONSUME;
02261 zzEXIT(zztasp1);
02262 return;
02263 fail:
02264 zzEXIT(zztasp1);
02265 zzsyn(zzMissText, zzBadTok, "RECURSIVEINLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02266 zzresynch(setwd5, 0x4);
02267 }
02268 }
02269
02270 void
02271 #ifdef __STDC__
02272 parser_generic_preamble( ParserContext &context )
02273 #else
02274 parser_generic_preamble(context)
02275 ParserContext &context ;
02276 #endif
02277 {
02278 zzRULE;
02279 zzBLOCK(zztasp1);
02280 zzMake0;
02281 {
02282 Statement *s = 0;
02283 AssertPreamble *a = 0;
02284 zzmatch(65); zzCONSUME;
02285 zzmatch(1);
02286
02287 s = &context.s_next;
02288
02289 a = new AssertPreamble;
02290 s->assertions().ins_last( a );
02291 zzCONSUME;
02292 zzEXIT(zztasp1);
02293 return;
02294 fail:
02295 zzEXIT(zztasp1);
02296 zzsyn(zzMissText, zzBadTok, "PREAMBLE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02297 zzresynch(setwd5, 0x8);
02298 }
02299 }
02300
02301 void
02302 #ifdef __STDC__
02303 parser_generic_postamble( ParserContext &context )
02304 #else
02305 parser_generic_postamble(context)
02306 ParserContext &context ;
02307 #endif
02308 {
02309 zzRULE;
02310 zzBLOCK(zztasp1);
02311 zzMake0;
02312 {
02313 Statement *s = 0;
02314 AssertPostamble *a = 0;
02315 zzmatch(66); zzCONSUME;
02316 zzmatch(1);
02317
02318 s = &context.s_next;
02319
02320 a = new AssertPostamble;
02321 s->assertions().ins_last( a );
02322 zzCONSUME;
02323 zzEXIT(zztasp1);
02324 return;
02325 fail:
02326 zzEXIT(zztasp1);
02327 zzsyn(zzMissText, zzBadTok, "POSTAMBLE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02328 zzresynch(setwd5, 0x10);
02329 }
02330 }
02331
02332 void
02333 #ifdef __STDC__
02334 parser_generic_noinline( ParserContext &context )
02335 #else
02336 parser_generic_noinline(context)
02337 ParserContext &context ;
02338 #endif
02339 {
02340 zzRULE;
02341 zzBLOCK(zztasp1);
02342 zzMake0;
02343 {
02344 Statement *s = 0;
02345 AssertNoInline *a = 0;
02346 zzmatch(67); zzCONSUME;
02347 zzmatch(1);
02348
02349 s = &context.s_next;
02350
02351 a = new AssertNoInline;
02352 s->assertions().ins_last( a );
02353 zzCONSUME;
02354 zzEXIT(zztasp1);
02355 return;
02356 fail:
02357 zzEXIT(zztasp1);
02358 zzsyn(zzMissText, zzBadTok, "NOINLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02359 zzresynch(setwd5, 0x20);
02360 }
02361 }
02362
02363 void
02364 #ifdef __STDC__
02365 parser_generic_noputget( ParserContext &context )
02366 #else
02367 parser_generic_noputget(context)
02368 ParserContext &context ;
02369 #endif
02370 {
02371 zzRULE;
02372 zzBLOCK(zztasp1);
02373 zzMake0;
02374 {
02375 Statement *s = 0;
02376 AssertNoPutGet *a = 0;
02377 zzmatch(68); zzCONSUME;
02378 zzmatch(1);
02379
02380 s = &context.s_next;
02381
02382 a = new AssertNoPutGet;
02383 s->assertions().ins_last( a );
02384 zzCONSUME;
02385 zzEXIT(zztasp1);
02386 return;
02387 fail:
02388 zzEXIT(zztasp1);
02389 zzsyn(zzMissText, zzBadTok, "NOPUTGET directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02390 zzresynch(setwd5, 0x40);
02391 }
02392 }
02393
02394 void
02395 #ifdef __STDC__
02396 parser_generic_runtimetest( ParserContext &context )
02397 #else
02398 parser_generic_runtimetest(context)
02399 ParserContext &context ;
02400 #endif
02401 {
02402 zzRULE;
02403 zzBLOCK(zztasp1);
02404 zzMake0;
02405 {
02406 Statement *s = 0;
02407 AssertRunTimeTest *a = 0;
02408 zzmatch(69); zzCONSUME;
02409 zzmatch(1);
02410
02411 s = &context.s_next;
02412
02413 a = new AssertRunTimeTest;
02414 s->assertions().ins_last( a );
02415 zzCONSUME;
02416 zzEXIT(zztasp1);
02417 return;
02418 fail:
02419 zzEXIT(zztasp1);
02420 zzsyn(zzMissText, zzBadTok, "RUNTIMETEST directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02421 zzresynch(setwd5, 0x80);
02422 }
02423 }
02424
02425 void
02426 #ifdef __STDC__
02427 parser_generic_end_block( ParserContext &context )
02428 #else
02429 parser_generic_end_block(context)
02430 ParserContext &context ;
02431 #endif
02432 {
02433 zzRULE;
02434 zzBLOCK(zztasp1);
02435 zzMake0;
02436 {
02437 Statement *s = 0;
02438 BlockEntryStmt *s_begin_block = 0;
02439 BlockExitStmt *s_end_block = 0;
02440 zzmatch(57); zzCONSUME;
02441 zzmatch(1);
02442
02443 s_end_block =
02444 new BlockExitStmt( context.pgm.stmts().new_tag() );
02445
02446 s = context.s_next.prev_ref();
02447
02448 if (s->stmt_class() == IMPLIED_GOTO_STMT)
02449 s = s->prev_ref();
02450
02451
02452
02453
02454 Directive::_ins_after(context.pgm.stmts(), s_end_block,
02455 s, "BLOCK_EXIT" );
02456
02457
02458
02459 for (s = s_end_block->prev_ref(); s != 0; s=s->prev_ref()) {
02460 if (s->stmt_class() == BLOCK_EXIT_STMT)
02461 s = s->follow_ref();
02462 else if (s->stmt_class() == BLOCK_ENTRY_STMT) {
02463 s_begin_block = (BlockEntryStmt *) s;
02464 break;
02465 }
02466 }
02467
02468 if (s_begin_block != 0) {
02469 Directive::_set_follow_fields(*s_begin_block,
02470 *s_end_block);
02471 }
02472 else {
02473 parse_error("END BLOCK: Could not find matching "
02474 "BEGIN BLOCK");
02475 }
02476
02477
02478 zzCONSUME;
02479 zzEXIT(zztasp1);
02480 return;
02481 fail:
02482 zzEXIT(zztasp1);
02483 zzsyn(zzMissText, zzBadTok, "END BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02484 zzresynch(setwd6, 0x1);
02485 }
02486 }
02487
02488 void
02489 #ifdef __STDC__
02490 parser_generic_last_value( ParserContext &context )
02491 #else
02492 parser_generic_last_value(context)
02493 ParserContext &context ;
02494 #endif
02495 {
02496 zzRULE;
02497 zzBLOCK(zztasp1);
02498 zzMake0;
02499 {
02500
02501 Statement *s = 0;
02502 Statement *s_do = 0;
02503 ExpressionList *lvalues = 0;
02504 zzmatch(70); zzCONSUME;
02505 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02506
02507 zzmatch(1);
02508
02509 s_do = enclosing_scope( context.s_next );
02510
02511 if (s_do != 0) {
02512 AssertLastValue *a = (AssertLastValue *)
02513 assertion_of_type(s_do->assertions(),
02514 AS_LASTVALUE);
02515 if (a == 0) {
02516 a = new AssertLastValue;
02517 s_do->assertions().ins_last( a );
02518 }
02519
02520 list_absorb(a->arg_list_guarded(), lvalues);
02521 }
02522 else {
02523 parse_error("LASTVALUE does not follow a DO loop");
02524 delete lvalues;
02525 }
02526 zzCONSUME;
02527 zzEXIT(zztasp1);
02528 return;
02529 fail:
02530 zzEXIT(zztasp1);
02531 zzsyn(zzMissText, zzBadTok, "LAST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02532 zzresynch(setwd6, 0x2);
02533 }
02534 }
02535
02536 void
02537 #ifdef __STDC__
02538 parser_csrd_dynlast_value( ParserContext &context )
02539 #else
02540 parser_csrd_dynlast_value(context)
02541 ParserContext &context ;
02542 #endif
02543 {
02544 zzRULE;
02545 zzBLOCK(zztasp1);
02546 zzMake0;
02547 {
02548
02549 Statement *s = 0;
02550 Statement *s_do = 0;
02551 ExpressionList *lvalues = 0;
02552 zzmatch(71); zzCONSUME;
02553 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02554
02555 zzmatch(1);
02556
02557 s_do = enclosing_scope( context.s_next );
02558
02559 if (s_do != 0) {
02560 AssertDynLastValue *a = (AssertDynLastValue *)
02561 assertion_of_type(s_do->assertions(),
02562 AS_DYNLASTVALUE);
02563 if (a == 0) {
02564 a = new AssertDynLastValue;
02565 s_do->assertions().ins_last( a );
02566 }
02567
02568 list_absorb(a->arg_list_guarded(), lvalues);
02569 }
02570 else {
02571 parse_error("DYNLASTVALUE does not follow a DO loop");
02572 delete lvalues;
02573 }
02574 zzCONSUME;
02575 zzEXIT(zztasp1);
02576 return;
02577 fail:
02578 zzEXIT(zztasp1);
02579 zzsyn(zzMissText, zzBadTok, "DYNAMIC LAST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02580 zzresynch(setwd6, 0x4);
02581 }
02582 }
02583
02584 void
02585 #ifdef __STDC__
02586 parser_generic_first_value( ParserContext &context )
02587 #else
02588 parser_generic_first_value(context)
02589 ParserContext &context ;
02590 #endif
02591 {
02592 zzRULE;
02593 zzBLOCK(zztasp1);
02594 zzMake0;
02595 {
02596
02597 Statement *s = 0;
02598 Statement *s_do = 0;
02599 ExpressionList *lvalues = 0;
02600 zzmatch(72); zzCONSUME;
02601 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02602
02603 zzmatch(1);
02604
02605 s_do = enclosing_scope( context.s_next );
02606
02607 if (s_do != 0) {
02608 AssertFirstValue *a = (AssertFirstValue *)
02609 assertion_of_type(s_do->assertions(),
02610 AS_FIRSTVALUE);
02611 if (a == 0) {
02612 a = new AssertFirstValue;
02613 s_do->assertions().ins_last( a );
02614 }
02615
02616 list_absorb(a->arg_list_guarded(), lvalues);
02617 }
02618 else {
02619 parse_error("FIRSTVALUE does not follow a DO loop");
02620 delete lvalues;
02621 }
02622 zzCONSUME;
02623 zzEXIT(zztasp1);
02624 return;
02625 fail:
02626 zzEXIT(zztasp1);
02627 zzsyn(zzMissText, zzBadTok, "FIRST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02628 zzresynch(setwd6, 0x8);
02629 }
02630 }
02631
02632 void
02633 #ifdef __STDC__
02634 parser_generic_forward( ParserContext &context )
02635 #else
02636 parser_generic_forward(context)
02637 ParserContext &context ;
02638 #endif
02639 {
02640 zzRULE;
02641 zzBLOCK(zztasp1);
02642 zzMake0;
02643 {
02644
02645 ExpressionList *elist = 0;
02646 AssertForward *a;
02647 zzmatch(73); zzCONSUME;
02648 elist = parser_expr_list_with_commas( context.pgm.symtab() );
02649
02650 zzmatch(1);
02651
02652
02653 a = new AssertForward;
02654 context.s_next.assertions().ins_last( a );
02655
02656 list_absorb(a->arg_list_guarded(), elist);
02657
02658
02659 zzCONSUME;
02660 zzEXIT(zztasp1);
02661 return;
02662 fail:
02663 zzEXIT(zztasp1);
02664 zzsyn(zzMissText, zzBadTok, "FORWARD directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02665 zzresynch(setwd6, 0x10);
02666 }
02667 }
02668
02669 void
02670 #ifdef __STDC__
02671 parser_csrd_range_written( ParserContext &context )
02672 #else
02673 parser_csrd_range_written(context)
02674 ParserContext &context ;
02675 #endif
02676 {
02677 zzRULE;
02678 zzBLOCK(zztasp1);
02679 zzMake0;
02680 {
02681
02682 Statement *s = 0;
02683 Statement *s_do = 0;
02684 ExpressionList *lvalues = 0;
02685 zzmatch(74); zzCONSUME;
02686 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02687
02688 zzmatch(1);
02689
02690 s_do = enclosing_scope( context.s_next );
02691
02692 if (s_do != 0) {
02693 AssertRangeWritten *a = (AssertRangeWritten *)
02694 assertion_of_type(s_do->assertions(),
02695 AS_RANGEWRITTEN);
02696 if (a == 0) {
02697 a = new AssertRangeWritten;
02698 s_do->assertions().ins_last( a );
02699 }
02700
02701 list_absorb(a->arg_list_guarded(), lvalues);
02702 }
02703 else {
02704 parse_error("RANGEWRITTEN does not follow a DO loop");
02705 delete lvalues;
02706 }
02707 zzCONSUME;
02708 zzEXIT(zztasp1);
02709 return;
02710 fail:
02711 zzEXIT(zztasp1);
02712 zzsyn(zzMissText, zzBadTok, "RANGE WRITTEN directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02713 zzresynch(setwd6, 0x20);
02714 }
02715 }
02716
02717 void
02718 #ifdef __STDC__
02719 parser_generic_parallel( ParserContext &context )
02720 #else
02721 parser_generic_parallel(context)
02722 ParserContext &context ;
02723 #endif
02724 {
02725 zzRULE;
02726 zzBLOCK(zztasp1);
02727 zzMake0;
02728 {
02729
02730 Symbol *scalar = 0;
02731 zzmatch(56); zzCONSUME;
02732 {
02733 zzBLOCK(zztasp2);
02734 zzMake0;
02735 {
02736 while ( (LA(1)==46) ) {
02737 zzmatch(46); zzCONSUME;
02738 scalar = parser_scalar_var( context );
02739
02740 zzmatch(47); zzCONSUME;
02741 zzLOOP(zztasp2);
02742 }
02743 zzEXIT(zztasp2);
02744 }
02745 }
02746 zzmatch(1);
02747
02748 force_parallel(context, scalar, "PARALLEL");
02749 zzCONSUME;
02750 zzEXIT(zztasp1);
02751 return;
02752 fail:
02753 zzEXIT(zztasp1);
02754 zzsyn(zzMissText, zzBadTok, "PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02755 zzresynch(setwd6, 0x40);
02756 }
02757 }
02758
02759 void
02760 #ifdef __STDC__
02761 parser_generic_serial( ParserContext &context )
02762 #else
02763 parser_generic_serial(context)
02764 ParserContext &context ;
02765 #endif
02766 {
02767 zzRULE;
02768 zzBLOCK(zztasp1);
02769 zzMake0;
02770 {
02771
02772 Statement *s = 0;
02773 Symbol *scalar = 0;
02774 zzmatch(75); zzCONSUME;
02775 {
02776 zzBLOCK(zztasp2);
02777 zzMake0;
02778 {
02779 while ( (LA(1)==46) ) {
02780 zzmatch(46); zzCONSUME;
02781 scalar = parser_scalar_var( context );
02782
02783 zzmatch(47); zzCONSUME;
02784 zzLOOP(zztasp2);
02785 }
02786 zzEXIT(zztasp2);
02787 }
02788 }
02789 zzmatch(1);
02790
02791 s = &context.s_next;
02792
02793 if (s != 0) {
02794 AssertSerial *a = (AssertSerial *)
02795 assertion_of_type( s->assertions(), AS_SERIAL);
02796 if (a == 0) {
02797 a = new AssertSerial;
02798 s->assertions().ins_last( a );
02799 }
02800 }
02801 zzCONSUME;
02802 zzEXIT(zztasp1);
02803 return;
02804 fail:
02805 zzEXIT(zztasp1);
02806 zzsyn(zzMissText, zzBadTok, "SERIAL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02807 zzresynch(setwd6, 0x80);
02808 }
02809 }
02810
02811 void
02812 #ifdef __STDC__
02813 parser_generic_critical( ParserContext &context )
02814 #else
02815 parser_generic_critical(context)
02816 ParserContext &context ;
02817 #endif
02818 {
02819 zzRULE;
02820 zzBLOCK(zztasp1);
02821 zzMake0;
02822 {
02823
02824 Statement *s = 0;
02825 Symbol *scalar = 0;
02826 zzmatch(76); zzCONSUME;
02827 {
02828 zzBLOCK(zztasp2);
02829 zzMake0;
02830 {
02831 while ( (LA(1)==46) ) {
02832 zzmatch(46); zzCONSUME;
02833 scalar = parser_scalar_var( context );
02834
02835 zzmatch(47); zzCONSUME;
02836 zzLOOP(zztasp2);
02837 }
02838 zzEXIT(zztasp2);
02839 }
02840 }
02841 zzmatch(1);
02842
02843 s = &context.s_next;
02844
02845 if (s != 0) {
02846 AssertCritical *a = (AssertCritical *)
02847 assertion_of_type(s->assertions(), AS_CRITICAL);
02848 if (a == 0) {
02849 a = new AssertCritical;
02850 s->assertions().ins_last( a );
02851 }
02852 }
02853 zzCONSUME;
02854 zzEXIT(zztasp1);
02855 return;
02856 fail:
02857 zzEXIT(zztasp1);
02858 zzsyn(zzMissText, zzBadTok, "CRITICAL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02859 zzresynch(setwd7, 0x1);
02860 }
02861 }
02862
02863 void
02864 #ifdef __STDC__
02865 parser_generic_reduction( ParserContext &context )
02866 #else
02867 parser_generic_reduction(context)
02868 ParserContext &context ;
02869 #endif
02870 {
02871 zzRULE;
02872 zzBLOCK(zztasp1);
02873 zzMake0;
02874 {
02875
02876 ExpressionList *lvalues = 0;
02877 Statement *s_do = 0;
02878 zzmatch(77); zzCONSUME;
02879 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02880
02881 zzmatch(1);
02882
02883 s_do = enclosing_scope( context.s_next );
02884
02885 if (s_do != 0) {
02886 AssertReduction *a = (AssertReduction *)
02887 assertion_of_type(s_do->assertions(),
02888 AS_REDUCTION);
02889 if (a == 0) {
02890 a = new AssertReduction;
02891 s_do->assertions().ins_last( a );
02892 }
02893
02894 list_absorb(a->arg_list_guarded(), lvalues);
02895 }
02896 else {
02897 parse_error("REDUCTION is not within a DO loop");
02898 delete lvalues;
02899 }
02900 zzCONSUME;
02901 zzEXIT(zztasp1);
02902 return;
02903 fail:
02904 zzEXIT(zztasp1);
02905 zzsyn(zzMissText, zzBadTok, "REDUCTION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02906 zzresynch(setwd7, 0x2);
02907 }
02908 }
02909
02910 void
02911 #ifdef __STDC__
02912 parser_generic_shared( ParserContext &context )
02913 #else
02914 parser_generic_shared(context)
02915 ParserContext &context ;
02916 #endif
02917 {
02918 zzRULE;
02919 zzBLOCK(zztasp1);
02920 zzMake0;
02921 {
02922
02923 ExpressionList *lvalues = 0;
02924 Statement *s = 0;
02925 AssertShared *a = 0;
02926 zzmatch(78);
02927 a = 0;
02928 s = enclosing_scope( context.s_next );
02929
02930 if (s != 0) {
02931
02932 a = (AssertShared *)
02933 assertion_of_type( s->assertions(),
02934 AS_SHARED );
02935 if (a == 0) {
02936 a = new AssertShared;
02937 s->assertions().ins_last( a );
02938 }
02939 }
02940 else {
02941 parse_error("SHARED is not within a DO loop or "
02942 "BLOCK ENTRY scope");
02943 }
02944 zzCONSUME;
02945 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
02946
02947 zzmatch(1);
02948
02949 if (a != 0)
02950 list_absorb(a->arg_list_guarded(), lvalues);
02951 else
02952 delete lvalues;
02953 zzCONSUME;
02954 zzEXIT(zztasp1);
02955 return;
02956 fail:
02957 zzEXIT(zztasp1);
02958 zzsyn(zzMissText, zzBadTok, "SHARED directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
02959 zzresynch(setwd7, 0x4);
02960 }
02961 }
02962
02963 void
02964 #ifdef __STDC__
02965 parser_csrd_directive( ParserContext &context )
02966 #else
02967 parser_csrd_directive(context)
02968 ParserContext &context ;
02969 #endif
02970 {
02971 zzRULE;
02972 zzBLOCK(zztasp1);
02973 zzMake0;
02974 {
02975 {
02976 zzBLOCK(zztasp2);
02977 zzMake0;
02978 {
02979 if ( (
02980 LA(1)==53) ) {
02981 parser_csrd_private( context );
02982 }
02983 else {
02984 if ( (LA(1)==54) ) {
02985 parser_csrd_assert( context );
02986 }
02987 else {
02988 if ( (LA(1)==55) ) {
02989 parser_csrd_safe_condition( context );
02990 }
02991 else {
02992 if ( (LA(1)==75) ) {
02993 parser_csrd_serial( context );
02994 }
02995 else {
02996 if ( (LA(1)==76) ) {
02997 parser_csrd_critical( context );
02998 }
02999 else {
03000 if ( (
03001 LA(1)==90) ) {
03002 parser_csrd_begin( context );
03003 }
03004 else {
03005 if ( (LA(1)==91) ) {
03006 parser_csrd_end( context );
03007 }
03008 else {
03009 if ( (LA(1)==70) ) {
03010 parser_csrd_last_value( context );
03011 }
03012 else {
03013 if ( (LA(1)==72) ) {
03014 parser_csrd_first_value( context );
03015 }
03016 else {
03017 if ( (LA(1)==73) ) {
03018 parser_csrd_forward( context );
03019 }
03020 else {
03021 if ( (
03022 LA(1)==71) ) {
03023 parser_csrd_dynlast_value( context );
03024 }
03025 else {
03026 if ( (LA(1)==74) ) {
03027 parser_csrd_range_written( context );
03028 }
03029 else {
03030 if ( (LA(1)==56) ) {
03031 parser_csrd_parallel( context );
03032 }
03033 else {
03034 if ( (LA(1)==77) ) {
03035 parser_csrd_reduction( context );
03036 }
03037 else {
03038 if ( (LA(1)==81) ) {
03039 parser_csrd_looplabel( context );
03040 }
03041 else {
03042 if ( (
03043 LA(1)==82) ) {
03044 parser_csrd_schedule( context );
03045 }
03046 else {
03047 if ( (LA(1)==78) ) {
03048 parser_csrd_shared( context );
03049 }
03050 else {
03051 if ( (LA(1)==84) ) {
03052 parser_csrd_induction( context );
03053 }
03054 else {
03055 if ( (LA(1)==85) ) {
03056 parser_csrd_parcondition( context );
03057 }
03058 else {
03059 if ( (LA(1)==86) ) {
03060 parser_csrd_nomod( context );
03061 }
03062 else {
03063 if ( (
03064 LA(1)==87) ) {
03065 parser_csrd_maymod( context );
03066 }
03067 else {
03068 if ( (LA(1)==83) ) {
03069 parser_csrd_privaterefs( context );
03070 }
03071 else {
03072 if ( (LA(1)==88) ) {
03073 parser_csrd_readonlyrefs( context );
03074 }
03075 else {
03076 if ( (LA(1)==89) ) {
03077 parser_csrd_sharedrefs( context );
03078 }
03079 else {
03080 if ( (LA(1)==65) ) {
03081 parser_csrd_preamble( context );
03082 }
03083 else {
03084 if ( (
03085 LA(1)==66) ) {
03086 parser_csrd_postamble( context );
03087 }
03088 else {
03089 if ( (LA(1)==58 || LA(1)==59 || LA(1)==60) ) {
03090 parser_csrd_instrument( context );
03091 }
03092 else {
03093 if ( (LA(1)==61) ) {
03094 parser_csrd_rtshadow( context );
03095 }
03096 else {
03097 if ( (
03098 LA(1)==63) ) {
03099 parser_csrd_inline( context );
03100 }
03101 else {
03102 if ( (LA(1)==64) ) {
03103 parser_csrd_recursive_inline( context );
03104 }
03105 else {
03106 if ( (LA(1)==68) ) {
03107 parser_csrd_noputget( context );
03108 }
03109 else {
03110 if ( (LA(1)==67) ) {
03111 parser_csrd_noinline( context );
03112 }
03113 else {
03114 if ( (LA(1)==69) ) {
03115 parser_csrd_runtimetest( context );
03116 }
03117 else {
03118 if ( (
03119 LA(1)==79) ) {
03120 parser_csrd_no_dependence( context );
03121 }
03122 else {
03123 if ( (LA(1)==80) ) {
03124 parser_csrd_sideeffectfree( context );
03125 }
03126 else {zzFAIL(1,zzerr13,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
03127 }
03128 }
03129 }
03130 }
03131 }
03132 }
03133 }
03134 }
03135 }
03136 }
03137 }
03138 }
03139 }
03140 }
03141 }
03142 }
03143 }
03144 }
03145 }
03146 }
03147 }
03148 }
03149 }
03150 }
03151 }
03152 }
03153 }
03154 }
03155 }
03156 }
03157 }
03158 }
03159 }
03160 }
03161 zzEXIT(zztasp2);
03162 }
03163 }
03164 zzEXIT(zztasp1);
03165 return;
03166 fail:
03167 zzEXIT(zztasp1);
03168 zzsyn(zzMissText, zzBadTok, "CSRD directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03169 zzresynch(setwd7, 0x8);
03170 }
03171 }
03172
03173 void
03174 #ifdef __STDC__
03175 parser_csrd_no_dependence( ParserContext &context )
03176 #else
03177 parser_csrd_no_dependence(context)
03178 ParserContext &context ;
03179 #endif
03180 {
03181 zzRULE;
03182 zzBLOCK(zztasp1);
03183 zzMake0;
03184 {
03185
03186 ExpressionList *lvalues = 0;
03187 Statement *s = 0;
03188 AssertNoDependence *a = 0;
03189 zzmatch(79);
03190 a = 0;
03191 s = enclosing_scope( context.s_next );
03192
03193 if (s != 0) {
03194
03195 a = (AssertNoDependence *)
03196 assertion_of_type( s->assertions(),
03197 AS_NODEPENDENCE );
03198 if (a == 0) {
03199 a = new AssertNoDependence;
03200 s->assertions().ins_last( a );
03201 }
03202 }
03203 else {
03204 parse_error("NO_DEPENDENCE is not within a DO loop or "
03205 "BLOCK ENTRY scope");
03206 }
03207 zzCONSUME;
03208 zzmatch(46); zzCONSUME;
03209 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
03210
03211 zzmatch(47); zzCONSUME;
03212 zzmatch(1);
03213
03214 if (a != 0)
03215 list_absorb(a->arg_list_guarded(), lvalues);
03216 else
03217 delete lvalues;
03218 zzCONSUME;
03219 zzEXIT(zztasp1);
03220 return;
03221 fail:
03222 zzEXIT(zztasp1);
03223 zzsyn(zzMissText, zzBadTok, "CSRD NO_DEPENDENCE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03224 zzresynch(setwd7, 0x10);
03225 }
03226 }
03227
03228 void
03229 #ifdef __STDC__
03230 parser_csrd_sideeffectfree( ParserContext &context )
03231 #else
03232 parser_csrd_sideeffectfree(context)
03233 ParserContext &context ;
03234 #endif
03235 {
03236 zzRULE;
03237 zzBLOCK(zztasp1);
03238 zzMake0;
03239 {
03240
03241 ExpressionList *lvalues = 0;
03242 Statement *s = 0;
03243 AssertSideEffectFree *a = 0;
03244 zzmatch(80);
03245 a = 0;
03246 s = &context.s_next;
03247
03248
03249 a = (AssertSideEffectFree *)
03250 assertion_of_type( s->assertions(),
03251 AS_SIDE_EFFECT_FREE );
03252 if (a == 0) {
03253 a = new AssertSideEffectFree;
03254 s->assertions().ins_last( a );
03255 }
03256
03257
03258 zzCONSUME;
03259 zzmatch(46); zzCONSUME;
03260 lvalues = parser_expr_list_with_commas( context.pgm.symtab() );
03261
03262 zzmatch(47); zzCONSUME;
03263 zzmatch(1);
03264
03265 if (a != 0)
03266 list_absorb(a->arg_list_guarded(), lvalues);
03267 else
03268 delete lvalues;
03269 zzCONSUME;
03270 zzEXIT(zztasp1);
03271 return;
03272 fail:
03273 zzEXIT(zztasp1);
03274 zzsyn(zzMissText, zzBadTok, "CSRD SIDE_EFFECT_FREE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03275 zzresynch(setwd7, 0x20);
03276 }
03277 }
03278
03279 void
03280 #ifdef __STDC__
03281 parser_csrd_preamble( ParserContext &context )
03282 #else
03283 parser_csrd_preamble(context)
03284 ParserContext &context ;
03285 #endif
03286 {
03287 zzRULE;
03288 zzBLOCK(zztasp1);
03289 zzMake0;
03290 {
03291 parser_generic_preamble( context );
03292 zzEXIT(zztasp1);
03293 return;
03294 fail:
03295 zzEXIT(zztasp1);
03296 zzsyn(zzMissText, zzBadTok, "CSRD PREAMBLE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03297 zzresynch(setwd7, 0x40);
03298 }
03299 }
03300
03301 void
03302 #ifdef __STDC__
03303 parser_csrd_postamble( ParserContext &context )
03304 #else
03305 parser_csrd_postamble(context)
03306 ParserContext &context ;
03307 #endif
03308 {
03309 zzRULE;
03310 zzBLOCK(zztasp1);
03311 zzMake0;
03312 {
03313 parser_generic_postamble( context );
03314 zzEXIT(zztasp1);
03315 return;
03316 fail:
03317 zzEXIT(zztasp1);
03318 zzsyn(zzMissText, zzBadTok, "CSRD POSTAMBLE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03319 zzresynch(setwd7, 0x80);
03320 }
03321 }
03322
03323 void
03324 #ifdef __STDC__
03325 parser_csrd_instrument( ParserContext &context )
03326 #else
03327 parser_csrd_instrument(context)
03328 ParserContext &context ;
03329 #endif
03330 {
03331 zzRULE;
03332 zzBLOCK(zztasp1);
03333 zzMake0;
03334 {
03335 parser_generic_instrument( context );
03336 zzEXIT(zztasp1);
03337 return;
03338 fail:
03339 zzEXIT(zztasp1);
03340 zzsyn(zzMissText, zzBadTok, "CSRD INSTRUMENT directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03341 zzresynch(setwd8, 0x1);
03342 }
03343 }
03344
03345 void
03346 #ifdef __STDC__
03347 parser_csrd_rtshadow( ParserContext &context )
03348 #else
03349 parser_csrd_rtshadow(context)
03350 ParserContext &context ;
03351 #endif
03352 {
03353 zzRULE;
03354 zzBLOCK(zztasp1);
03355 zzMake0;
03356 {
03357 parser_generic_rtshadow( context );
03358 zzEXIT(zztasp1);
03359 return;
03360 fail:
03361 zzEXIT(zztasp1);
03362 zzsyn(zzMissText, zzBadTok, "CSRD RTSHADOW directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03363 zzresynch(setwd8, 0x2);
03364 }
03365 }
03366
03367 void
03368 #ifdef __STDC__
03369 parser_csrd_depio( ParserContext &context )
03370 #else
03371 parser_csrd_depio(context)
03372 ParserContext &context ;
03373 #endif
03374 {
03375 zzRULE;
03376 zzBLOCK(zztasp1);
03377 zzMake0;
03378 {
03379 parser_generic_depio( context );
03380 zzEXIT(zztasp1);
03381 return;
03382 fail:
03383 zzEXIT(zztasp1);
03384 zzsyn(zzMissText, zzBadTok, "CSRD DEP_IO directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03385 zzresynch(setwd8, 0x4);
03386 }
03387 }
03388
03389 void
03390 #ifdef __STDC__
03391 parser_csrd_inline( ParserContext &context )
03392 #else
03393 parser_csrd_inline(context)
03394 ParserContext &context ;
03395 #endif
03396 {
03397 zzRULE;
03398 zzBLOCK(zztasp1);
03399 zzMake0;
03400 {
03401 parser_generic_inline( context );
03402 zzEXIT(zztasp1);
03403 return;
03404 fail:
03405 zzEXIT(zztasp1);
03406 zzsyn(zzMissText, zzBadTok, "CSRD INLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03407 zzresynch(setwd8, 0x8);
03408 }
03409 }
03410
03411 void
03412 #ifdef __STDC__
03413 parser_csrd_recursive_inline( ParserContext &context )
03414 #else
03415 parser_csrd_recursive_inline(context)
03416 ParserContext &context ;
03417 #endif
03418 {
03419 zzRULE;
03420 zzBLOCK(zztasp1);
03421 zzMake0;
03422 {
03423 parser_generic_recursive_inline( context );
03424 zzEXIT(zztasp1);
03425 return;
03426 fail:
03427 zzEXIT(zztasp1);
03428 zzsyn(zzMissText, zzBadTok, "CSRD RECURSIVEINLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03429 zzresynch(setwd8, 0x10);
03430 }
03431 }
03432
03433 void
03434 #ifdef __STDC__
03435 parser_csrd_noputget( ParserContext &context )
03436 #else
03437 parser_csrd_noputget(context)
03438 ParserContext &context ;
03439 #endif
03440 {
03441 zzRULE;
03442 zzBLOCK(zztasp1);
03443 zzMake0;
03444 {
03445 parser_generic_noputget( context );
03446 zzEXIT(zztasp1);
03447 return;
03448 fail:
03449 zzEXIT(zztasp1);
03450 zzsyn(zzMissText, zzBadTok, "CSRD NOPUTGET directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03451 zzresynch(setwd8, 0x20);
03452 }
03453 }
03454
03455 void
03456 #ifdef __STDC__
03457 parser_csrd_noinline( ParserContext &context )
03458 #else
03459 parser_csrd_noinline(context)
03460 ParserContext &context ;
03461 #endif
03462 {
03463 zzRULE;
03464 zzBLOCK(zztasp1);
03465 zzMake0;
03466 {
03467 parser_generic_noinline( context );
03468 zzEXIT(zztasp1);
03469 return;
03470 fail:
03471 zzEXIT(zztasp1);
03472 zzsyn(zzMissText, zzBadTok, "CSRD NOINLINE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03473 zzresynch(setwd8, 0x40);
03474 }
03475 }
03476
03477 void
03478 #ifdef __STDC__
03479 parser_csrd_runtimetest( ParserContext &context )
03480 #else
03481 parser_csrd_runtimetest(context)
03482 ParserContext &context ;
03483 #endif
03484 {
03485 zzRULE;
03486 zzBLOCK(zztasp1);
03487 zzMake0;
03488 {
03489 parser_generic_runtimetest( context );
03490 zzEXIT(zztasp1);
03491 return;
03492 fail:
03493 zzEXIT(zztasp1);
03494 zzsyn(zzMissText, zzBadTok, "CSRD RUN_TIME_TEST directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03495 zzresynch(setwd8, 0x80);
03496 }
03497 }
03498
03499 void
03500 #ifdef __STDC__
03501 parser_csrd_private( ParserContext &context )
03502 #else
03503 parser_csrd_private(context)
03504 ParserContext &context ;
03505 #endif
03506 {
03507 zzRULE;
03508 zzBLOCK(zztasp1);
03509 zzMake0;
03510 {
03511 parser_generic_private( context );
03512 zzEXIT(zztasp1);
03513 return;
03514 fail:
03515 zzEXIT(zztasp1);
03516 zzsyn(zzMissText, zzBadTok, "CSRD PRIVATE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03517 zzresynch(setwd9, 0x1);
03518 }
03519 }
03520
03521 void
03522 #ifdef __STDC__
03523 parser_csrd_assert( ParserContext &context )
03524 #else
03525 parser_csrd_assert(context)
03526 ParserContext &context ;
03527 #endif
03528 {
03529 zzRULE;
03530 zzBLOCK(zztasp1);
03531 zzMake0;
03532 {
03533 parser_generic_assert( context );
03534 zzEXIT(zztasp1);
03535 return;
03536 fail:
03537 zzEXIT(zztasp1);
03538 zzsyn(zzMissText, zzBadTok, "CSRD ASSERT directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03539 zzresynch(setwd9, 0x2);
03540 }
03541 }
03542
03543 void
03544 #ifdef __STDC__
03545 parser_csrd_safe_condition( ParserContext &context )
03546 #else
03547 parser_csrd_safe_condition(context)
03548 ParserContext &context ;
03549 #endif
03550 {
03551 zzRULE;
03552 zzBLOCK(zztasp1);
03553 zzMake0;
03554 {
03555 parser_generic_safe_condition( context );
03556 zzEXIT(zztasp1);
03557 return;
03558 fail:
03559 zzEXIT(zztasp1);
03560 zzsyn(zzMissText, zzBadTok, "CSRD SAFE_CONDITION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03561 zzresynch(setwd9, 0x4);
03562 }
03563 }
03564
03565 void
03566 #ifdef __STDC__
03567 parser_csrd_critical( ParserContext &context )
03568 #else
03569 parser_csrd_critical(context)
03570 ParserContext &context ;
03571 #endif
03572 {
03573 zzRULE;
03574 zzBLOCK(zztasp1);
03575 zzMake0;
03576 {
03577 parser_generic_critical( context );
03578 zzEXIT(zztasp1);
03579 return;
03580 fail:
03581 zzEXIT(zztasp1);
03582 zzsyn(zzMissText, zzBadTok, "CSRD CRITICAL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03583 zzresynch(setwd9, 0x8);
03584 }
03585 }
03586
03587 void
03588 #ifdef __STDC__
03589 parser_csrd_serial( ParserContext &context )
03590 #else
03591 parser_csrd_serial(context)
03592 ParserContext &context ;
03593 #endif
03594 {
03595 zzRULE;
03596 zzBLOCK(zztasp1);
03597 zzMake0;
03598 {
03599 parser_generic_serial( context );
03600 zzEXIT(zztasp1);
03601 return;
03602 fail:
03603 zzEXIT(zztasp1);
03604 zzsyn(zzMissText, zzBadTok, "CSRD SERIAL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03605 zzresynch(setwd9, 0x10);
03606 }
03607 }
03608
03609 void
03610 #ifdef __STDC__
03611 parser_csrd_looplabel( ParserContext &context )
03612 #else
03613 parser_csrd_looplabel(context)
03614 ParserContext &context ;
03615 #endif
03616 {
03617 zzRULE;
03618 zzBLOCK(zztasp1);
03619 zzMake0;
03620 {
03621
03622 AssertLoopLabel *a = 0;
03623 Expression *e = 0;
03624 String name = "";
03625 zzmatch(81); zzCONSUME;
03626 e = parser_fortran_constant();
03627
03628 zzmatch(1);
03629
03630 a = new AssertLoopLabel;
03631
03632 a->string_arg_list_guarded().ins_last(new StringElem (e->str_data()));
03633 p_assert(context.s_next.stmt_class() == DO_STMT,
03634 "Statement after a LOOPLABEL directive should be a DO statement");
03635 context.s_next.assertions().ins_last(a);
03636 zzCONSUME;
03637 zzEXIT(zztasp1);
03638 return;
03639 fail:
03640 zzEXIT(zztasp1);
03641 zzsyn(zzMissText, zzBadTok, "CSRD LOOPLABEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03642 zzresynch(setwd9, 0x20);
03643 }
03644 }
03645
03646 void
03647 #ifdef __STDC__
03648 parser_csrd_schedule( ParserContext &context )
03649 #else
03650 parser_csrd_schedule(context)
03651 ParserContext &context ;
03652 #endif
03653 {
03654 zzRULE;
03655 zzBLOCK(zztasp1);
03656 zzMake0;
03657 {
03658
03659 AssertSchedule *a = 0;
03660 Expression *e = 0;
03661 String name = "";
03662 zzmatch(82); zzCONSUME;
03663 e = parser_fortran_constant();
03664
03665 zzmatch(1);
03666
03667 a = new AssertSchedule;
03668
03669
03670
03671 name = String(e->str_data(), 1, e->str_data().len()-2);
03672 a->string_arg_list_guarded().ins_last(new StringElem (name));
03673 p_assert(context.s_next.stmt_class() == DO_STMT,
03674 "Statement after a SCHEDULE directive should be a DO statement");
03675 context.s_next.assertions().ins_last(a);
03676 zzCONSUME;
03677 zzEXIT(zztasp1);
03678 return;
03679 fail:
03680 zzEXIT(zztasp1);
03681 zzsyn(zzMissText, zzBadTok, "CSRD SCHEDULE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03682 zzresynch(setwd9, 0x40);
03683 }
03684 }
03685
03686 void
03687 #ifdef __STDC__
03688 parser_csrd_privaterefs( ParserContext &context )
03689 #else
03690 parser_csrd_privaterefs(context)
03691 ParserContext &context ;
03692 #endif
03693 {
03694 zzRULE;
03695 zzBLOCK(zztasp1);
03696 zzMake0;
03697 {
03698
03699 ExpressionList *lvalues = 0;
03700 Statement *s = 0;
03701 AssertPrivateRefs *a = 0;
03702 zzmatch(83);
03703 a = 0;
03704 s = enclosing_scope( context.s_next );
03705
03706 if (s != 0) {
03707 a = new AssertPrivateRefs;
03708 s->assertions().ins_last( a );
03709 }
03710 else {
03711 parse_error("PRIVATE_REFS is not within a DO loop or "
03712 "BLOCK ENTRY scope");
03713 }
03714 zzCONSUME;
03715 {
03716 zzBLOCK(zztasp2);
03717 zzMake0;
03718 {
03719 if ( (LA(1)==46) ) {
03720 lvalues = parser_list_paren_comma_exprs( context.pgm.symtab() );
03721
03722 }
03723 zzEXIT(zztasp2);
03724 }
03725 }
03726 zzmatch(1);
03727
03728 if (a != 0)
03729 list_absorb(a->arg_list_guarded(), lvalues);
03730 else
03731 delete lvalues;
03732 zzCONSUME;
03733 zzEXIT(zztasp1);
03734 return;
03735 fail:
03736 zzEXIT(zztasp1);
03737 zzsyn(zzMissText, zzBadTok, "PRIVATE_REFS directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03738 zzresynch(setwd9, 0x80);
03739 }
03740 }
03741
03742 void
03743 #ifdef __STDC__
03744 parser_csrd_induction( ParserContext &context )
03745 #else
03746 parser_csrd_induction(context)
03747 ParserContext &context ;
03748 #endif
03749 {
03750 zzRULE;
03751 zzBLOCK(zztasp1);
03752 zzMake0;
03753 {
03754
03755 Expression *comma_ex = 0;
03756 AssertInduction *a = 0;
03757 zzmatch(84);
03758
03759 a = new AssertInduction;
03760 context.s_prev.assertions().ins_last( a );
03761 zzCONSUME;
03762 {
03763 zzBLOCK(zztasp2);
03764 zzMake0;
03765 {
03766 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST ||
03767 LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 ||
03768 LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
03769 comma_ex = parser_comma_expr( context.pgm.symtab() );
03770
03771 }
03772 zzEXIT(zztasp2);
03773 }
03774 }
03775 zzmatch(1);
03776
03777 if (a != 0)
03778 a->arg_list_guarded().ins_last(comma_ex);
03779 else
03780 delete comma_ex;
03781 zzCONSUME;
03782 zzEXIT(zztasp1);
03783 return;
03784 fail:
03785 zzEXIT(zztasp1);
03786 zzsyn(zzMissText, zzBadTok, "INDUCTION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03787 zzresynch(setwd10, 0x1);
03788 }
03789 }
03790
03791 void
03792 #ifdef __STDC__
03793 parser_csrd_parcondition( ParserContext &context )
03794 #else
03795 parser_csrd_parcondition(context)
03796 ParserContext &context ;
03797 #endif
03798 {
03799 zzRULE;
03800 zzBLOCK(zztasp1);
03801 zzMake0;
03802 {
03803
03804 Expression *expr = 0;
03805 AssertParallelCondition *a = 0;
03806 zzmatch(85);
03807
03808
03809 a = new AssertParallelCondition;
03810 context.s_next.assertions().ins_last( a );
03811 zzCONSUME;
03812 {
03813 zzBLOCK(zztasp2);
03814 zzMake0;
03815 {
03816 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST ||
03817 LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 ||
03818 LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
03819 expr = parser_expression( context.pgm.symtab() );
03820
03821 }
03822 zzEXIT(zztasp2);
03823 }
03824 }
03825 zzmatch(1);
03826
03827 if (a != 0)
03828 a->arg_list_guarded().ins_last(expr);
03829 else
03830 delete expr;
03831 zzCONSUME;
03832 zzEXIT(zztasp1);
03833 return;
03834 fail:
03835 zzEXIT(zztasp1);
03836 zzsyn(zzMissText, zzBadTok, "PARALLEL CONDITION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03837 zzresynch(setwd10, 0x2);
03838 }
03839 }
03840
03841 void
03842 #ifdef __STDC__
03843 parser_csrd_nomod( ParserContext &context )
03844 #else
03845 parser_csrd_nomod(context)
03846 ParserContext &context ;
03847 #endif
03848 {
03849 zzRULE;
03850 zzBLOCK(zztasp1);
03851 zzMake0;
03852 {
03853
03854 ExpressionList *lvalues = 0;
03855 Statement *s = 0;
03856 AssertNoMod *a = 0;
03857 zzmatch(86);
03858 a = new AssertNoMod;
03859 context.s_next.assertions().ins_last( a );
03860 zzCONSUME;
03861 {
03862 zzBLOCK(zztasp2);
03863 zzMake0;
03864 {
03865 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST ||
03866 LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 ||
03867 LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
03868 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
03869
03870 }
03871 zzEXIT(zztasp2);
03872 }
03873 }
03874 zzmatch(1);
03875
03876 if (a != 0)
03877 list_absorb(a->arg_list_guarded(), lvalues);
03878 else
03879 delete lvalues;
03880 zzCONSUME;
03881 zzEXIT(zztasp1);
03882 return;
03883 fail:
03884 zzEXIT(zztasp1);
03885 zzsyn(zzMissText, zzBadTok, "NOMOD directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03886 zzresynch(setwd10, 0x4);
03887 }
03888 }
03889
03890 void
03891 #ifdef __STDC__
03892 parser_csrd_maymod( ParserContext &context )
03893 #else
03894 parser_csrd_maymod(context)
03895 ParserContext &context ;
03896 #endif
03897 {
03898 zzRULE;
03899 zzBLOCK(zztasp1);
03900 zzMake0;
03901 {
03902
03903 ExpressionList *lvalues = 0;
03904 Statement *s = 0;
03905 AssertMayMod *a = 0;
03906 zzmatch(87);
03907 a = new AssertMayMod;
03908 context.s_next.assertions().ins_last( a );
03909 zzCONSUME;
03910 {
03911 zzBLOCK(zztasp2);
03912 zzMake0;
03913 {
03914 if ( (LA(1)==F_NUM_CONST || LA(1)==APOST_CHAR_CST ||
03915 LA(1)==QUOTE_CHAR_CST || LA(1)==33 || LA(1)==41 || LA(1)==42 || LA(1)==46 ||
03916 LA(1)==50 || LA(1)==51 || LA(1)==FORTRAN_ID) ) {
03917 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
03918
03919 }
03920 zzEXIT(zztasp2);
03921 }
03922 }
03923 zzmatch(1);
03924
03925 if (a != 0)
03926 list_absorb(a->arg_list_guarded(), lvalues);
03927 else
03928 delete lvalues;
03929 zzCONSUME;
03930 zzEXIT(zztasp1);
03931 return;
03932 fail:
03933 zzEXIT(zztasp1);
03934 zzsyn(zzMissText, zzBadTok, "MAYMOD directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
03935 zzresynch(setwd10, 0x8);
03936 }
03937 }
03938
03939 ExpressionList *
03940 #ifdef __STDC__
03941 parser_list_paren_comma_exprs( Symtab &symtab )
03942 #else
03943 parser_list_paren_comma_exprs(symtab)
03944 Symtab &symtab ;
03945 #endif
03946 {
03947 ExpressionList * _retv;
03948 zzRULE;
03949 zzBLOCK(zztasp1);
03950 zzMake0;
03951 {
03952 Expression *e = 0;
03953 _retv = new ExpressionList;
03954 {
03955 zzBLOCK(zztasp2);
03956 zzMake0;
03957 {
03958 e = parser_paren_comma_expr( symtab );
03959
03960 _retv->ins_last(e);
03961 {
03962 zzBLOCK(zztasp3);
03963 zzMake0;
03964 {
03965 while ( (LA(1)==48) ) {
03966 zzmatch(48); zzCONSUME;
03967 e = parser_paren_comma_expr( symtab );
03968
03969 _retv->ins_last(e);
03970 zzLOOP(zztasp3);
03971 }
03972 zzEXIT(zztasp3);
03973 }
03974 }
03975 zzEXIT(zztasp2);
03976 }
03977 }
03978 zzEXIT(zztasp1);
03979 return _retv;
03980 fail:
03981 zzEXIT(zztasp1);
03982 zzsyn(zzMissText, zzBadTok, "list of parenthesized comma expressions", zzMissSet, zzMissTok, zzErrk, zzBadText);
03983 zzresynch(setwd10, 0x10);
03984 return _retv;
03985 }
03986 }
03987
03988 Expression *
03989 #ifdef __STDC__
03990 parser_paren_comma_expr( Symtab &symtab )
03991 #else
03992 parser_paren_comma_expr(symtab)
03993 Symtab &symtab ;
03994 #endif
03995 {
03996 Expression * _retv;
03997 zzRULE;
03998 zzBLOCK(zztasp1);
03999 zzMake0;
04000 {
04001 Expression *e2 = 0;
04002 {
04003 zzBLOCK(zztasp2);
04004 zzMake0;
04005 {
04006 zzmatch(46); zzCONSUME;
04007 e2 = parser_comma_expr( symtab );
04008
04009 zzmatch(47); zzCONSUME;
04010 zzEXIT(zztasp2);
04011 }
04012 }
04013
04014 if (e2)
04015 _retv = paren(e2);
04016 zzEXIT(zztasp1);
04017 return _retv;
04018 fail:
04019 zzEXIT(zztasp1);
04020 zzsyn(zzMissText, zzBadTok, "parenthesized comma-list", zzMissSet, zzMissTok, zzErrk, zzBadText);
04021 zzresynch(setwd10, 0x20);
04022 return _retv;
04023 }
04024 }
04025
04026 Expression *
04027 #ifdef __STDC__
04028 parser_comma_expr( Symtab &symtab )
04029 #else
04030 parser_comma_expr(symtab)
04031 Symtab &symtab ;
04032 #endif
04033 {
04034 Expression * _retv;
04035 zzRULE;
04036 zzBLOCK(zztasp1);
04037 zzMake0;
04038 {
04039 ExpressionList *list = new ExpressionList;
04040 Expression *e2;
04041 {
04042 zzBLOCK(zztasp2);
04043 zzMake0;
04044 {
04045 e2 = parser_expression( symtab );
04046
04047 list->ins_last(e2);
04048 {
04049 zzBLOCK(zztasp3);
04050 zzMake0;
04051 {
04052 while ( (LA(1)==48) ) {
04053 zzmatch(48); zzCONSUME;
04054 e2 = parser_expression( symtab );
04055
04056 list->ins_last(e2);
04057 zzLOOP(zztasp3);
04058 }
04059 zzEXIT(zztasp3);
04060 }
04061 }
04062 zzEXIT(zztasp2);
04063 }
04064 }
04065 _retv = comma(list); list = 0;
04066 zzEXIT(zztasp1);
04067 return _retv;
04068 fail:
04069 zzEXIT(zztasp1);
04070 if (list) { delete list; }
04071 zzsyn(zzMissText, zzBadTok, "Comma expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
04072 zzresynch(setwd10, 0x40);
04073 return _retv;
04074 }
04075 }
04076
04077 void
04078 #ifdef __STDC__
04079 parser_csrd_readonlyrefs( ParserContext &context )
04080 #else
04081 parser_csrd_readonlyrefs(context)
04082 ParserContext &context ;
04083 #endif
04084 {
04085 zzRULE;
04086 zzBLOCK(zztasp1);
04087 zzMake0;
04088 {
04089
04090 ExpressionList *lvalues = 0;
04091 Statement *s = 0;
04092 AssertReadOnlyRefs *a = 0;
04093 zzmatch(88);
04094 a = 0;
04095 s = enclosing_scope( context.s_next );
04096
04097 if (s != 0) {
04098 a = new AssertReadOnlyRefs;
04099 s->assertions().ins_last( a );
04100 }
04101 else {
04102 parse_error("READ_ONLY_REFS is not within a DO loop or "
04103 "BLOCK ENTRY scope");
04104 }
04105 zzCONSUME;
04106 {
04107 zzBLOCK(zztasp2);
04108 zzMake0;
04109 {
04110 if ( (
04111 LA(1)==46) ) {
04112 lvalues = parser_list_paren_comma_exprs( context.pgm.symtab() );
04113
04114 }
04115 zzEXIT(zztasp2);
04116 }
04117 }
04118 zzmatch(1);
04119
04120 if (a != 0)
04121 list_absorb(a->arg_list_guarded(), lvalues);
04122 else
04123 delete lvalues;
04124 zzCONSUME;
04125 zzEXIT(zztasp1);
04126 return;
04127 fail:
04128 zzEXIT(zztasp1);
04129 zzsyn(zzMissText, zzBadTok, "READONLY_REFS directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04130 zzresynch(setwd10, 0x80);
04131 }
04132 }
04133
04134 void
04135 #ifdef __STDC__
04136 parser_csrd_sharedrefs( ParserContext &context )
04137 #else
04138 parser_csrd_sharedrefs(context)
04139 ParserContext &context ;
04140 #endif
04141 {
04142 zzRULE;
04143 zzBLOCK(zztasp1);
04144 zzMake0;
04145 {
04146
04147 ExpressionList *lvalues = 0;
04148 Statement *s = 0;
04149 AssertSharedRefs *a = 0;
04150 zzmatch(89);
04151 a = 0;
04152 s = enclosing_scope( context.s_next );
04153
04154 if (s != 0) {
04155 a = new AssertSharedRefs;
04156 s->assertions().ins_last( a );
04157 }
04158 else {
04159 parse_error("SHARED_REFS is not within a DO loop or "
04160 "BLOCK ENTRY scope");
04161 }
04162 zzCONSUME;
04163 {
04164 zzBLOCK(zztasp2);
04165 zzMake0;
04166 {
04167 if ( (LA(1)==46) ) {
04168 lvalues = parser_list_paren_comma_exprs( context.pgm.symtab() );
04169
04170 }
04171 zzEXIT(zztasp2);
04172 }
04173 }
04174 zzmatch(1);
04175
04176 if (a != 0)
04177 list_absorb(a->arg_list_guarded(), lvalues);
04178 else
04179 delete lvalues;
04180 zzCONSUME;
04181 zzEXIT(zztasp1);
04182 return;
04183 fail:
04184 zzEXIT(zztasp1);
04185 zzsyn(zzMissText, zzBadTok, "SHARED_REFS directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04186 zzresynch(setwd11, 0x1);
04187 }
04188 }
04189
04190 void
04191 #ifdef __STDC__
04192 parser_csrd_begin( ParserContext &context )
04193 #else
04194 parser_csrd_begin(context)
04195 ParserContext &context ;
04196 #endif
04197 {
04198 zzRULE;
04199 zzBLOCK(zztasp1);
04200 zzMake0;
04201 {
04202 zzmatch(90); zzCONSUME;
04203 {
04204 zzBLOCK(zztasp2);
04205 zzMake0;
04206 {
04207 if ( (LA(1)==57) ) {
04208 parser_csrd_begin_block( context );
04209 }
04210 else {
04211 if ( (LA(1)==56) ) {
04212 parser_csrd_begin_parallel( context );
04213 }
04214 else {zzFAIL(1,zzerr14,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
04215 }
04216 zzEXIT(zztasp2);
04217 }
04218 }
04219 zzEXIT(zztasp1);
04220 return;
04221 fail:
04222 zzEXIT(zztasp1);
04223 zzsyn(zzMissText, zzBadTok, "CSRD BEGIN directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04224 zzresynch(setwd11, 0x2);
04225 }
04226 }
04227
04228 void
04229 #ifdef __STDC__
04230 parser_csrd_end( ParserContext &context )
04231 #else
04232 parser_csrd_end(context)
04233 ParserContext &context ;
04234 #endif
04235 {
04236 zzRULE;
04237 zzBLOCK(zztasp1);
04238 zzMake0;
04239 {
04240 zzmatch(91); zzCONSUME;
04241 {
04242 zzBLOCK(zztasp2);
04243 zzMake0;
04244 {
04245 if ( (LA(1)==57) ) {
04246 parser_csrd_end_block( context );
04247 }
04248 else {
04249 if ( (
04250 LA(1)==56) ) {
04251 parser_csrd_end_parallel( context );
04252 }
04253 else {zzFAIL(1,zzerr15,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
04254 }
04255 zzEXIT(zztasp2);
04256 }
04257 }
04258 zzEXIT(zztasp1);
04259 return;
04260 fail:
04261 zzEXIT(zztasp1);
04262 zzsyn(zzMissText, zzBadTok, "CSRD END directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04263 zzresynch(setwd11, 0x4);
04264 }
04265 }
04266
04267 void
04268 #ifdef __STDC__
04269 parser_csrd_begin_parallel( ParserContext &context )
04270 #else
04271 parser_csrd_begin_parallel(context)
04272 ParserContext &context ;
04273 #endif
04274 {
04275 zzRULE;
04276 zzBLOCK(zztasp1);
04277 zzMake0;
04278 {
04279 parser_generic_begin_parallel( context );
04280 zzEXIT(zztasp1);
04281 return;
04282 fail:
04283 zzEXIT(zztasp1);
04284 zzsyn(zzMissText, zzBadTok, "CSRD BEGIN PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04285 zzresynch(setwd11, 0x8);
04286 }
04287 }
04288
04289 void
04290 #ifdef __STDC__
04291 parser_csrd_end_parallel( ParserContext &context )
04292 #else
04293 parser_csrd_end_parallel(context)
04294 ParserContext &context ;
04295 #endif
04296 {
04297 zzRULE;
04298 zzBLOCK(zztasp1);
04299 zzMake0;
04300 {
04301 parser_generic_end_parallel( context );
04302 zzEXIT(zztasp1);
04303 return;
04304 fail:
04305 zzEXIT(zztasp1);
04306 zzsyn(zzMissText, zzBadTok, "CSRD END PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04307 zzresynch(setwd11, 0x10);
04308 }
04309 }
04310
04311 void
04312 #ifdef __STDC__
04313 parser_csrd_begin_block( ParserContext &context )
04314 #else
04315 parser_csrd_begin_block(context)
04316 ParserContext &context ;
04317 #endif
04318 {
04319 zzRULE;
04320 zzBLOCK(zztasp1);
04321 zzMake0;
04322 {
04323 parser_generic_begin_block( context );
04324 zzEXIT(zztasp1);
04325 return;
04326 fail:
04327 zzEXIT(zztasp1);
04328 zzsyn(zzMissText, zzBadTok, "CSRD BEGIN BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04329 zzresynch(setwd11, 0x20);
04330 }
04331 }
04332
04333 void
04334 #ifdef __STDC__
04335 parser_csrd_end_block( ParserContext &context )
04336 #else
04337 parser_csrd_end_block(context)
04338 ParserContext &context ;
04339 #endif
04340 {
04341 zzRULE;
04342 zzBLOCK(zztasp1);
04343 zzMake0;
04344 {
04345 parser_generic_end_block( context );
04346 zzEXIT(zztasp1);
04347 return;
04348 fail:
04349 zzEXIT(zztasp1);
04350 zzsyn(zzMissText, zzBadTok, "CSRD END BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04351 zzresynch(setwd11, 0x40);
04352 }
04353 }
04354
04355 void
04356 #ifdef __STDC__
04357 parser_csrd_last_value( ParserContext &context )
04358 #else
04359 parser_csrd_last_value(context)
04360 ParserContext &context ;
04361 #endif
04362 {
04363 zzRULE;
04364 zzBLOCK(zztasp1);
04365 zzMake0;
04366 {
04367 parser_generic_last_value( context );
04368 zzEXIT(zztasp1);
04369 return;
04370 fail:
04371 zzEXIT(zztasp1);
04372 zzsyn(zzMissText, zzBadTok, "CSRD LAST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04373 zzresynch(setwd11, 0x80);
04374 }
04375 }
04376
04377 void
04378 #ifdef __STDC__
04379 parser_csrd_first_value( ParserContext &context )
04380 #else
04381 parser_csrd_first_value(context)
04382 ParserContext &context ;
04383 #endif
04384 {
04385 zzRULE;
04386 zzBLOCK(zztasp1);
04387 zzMake0;
04388 {
04389 parser_generic_first_value( context );
04390 zzEXIT(zztasp1);
04391 return;
04392 fail:
04393 zzEXIT(zztasp1);
04394 zzsyn(zzMissText, zzBadTok, "CSRD FIRST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04395 zzresynch(setwd12, 0x1);
04396 }
04397 }
04398
04399 void
04400 #ifdef __STDC__
04401 parser_csrd_forward( ParserContext &context )
04402 #else
04403 parser_csrd_forward(context)
04404 ParserContext &context ;
04405 #endif
04406 {
04407 zzRULE;
04408 zzBLOCK(zztasp1);
04409 zzMake0;
04410 {
04411 parser_generic_forward( context );
04412 zzEXIT(zztasp1);
04413 return;
04414 fail:
04415 zzEXIT(zztasp1);
04416 zzsyn(zzMissText, zzBadTok, "CSRD FORWARD directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04417 zzresynch(setwd12, 0x2);
04418 }
04419 }
04420
04421 void
04422 #ifdef __STDC__
04423 parser_csrd_parallel( ParserContext &context )
04424 #else
04425 parser_csrd_parallel(context)
04426 ParserContext &context ;
04427 #endif
04428 {
04429 zzRULE;
04430 zzBLOCK(zztasp1);
04431 zzMake0;
04432 {
04433 parser_generic_parallel( context );
04434 zzEXIT(zztasp1);
04435 return;
04436 fail:
04437 zzEXIT(zztasp1);
04438 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
04439 zzresynch(setwd12, 0x4);
04440 }
04441 }
04442
04443 void
04444 #ifdef __STDC__
04445 parser_csrd_reduction( ParserContext &context )
04446 #else
04447 parser_csrd_reduction(context)
04448 ParserContext &context ;
04449 #endif
04450 {
04451 zzRULE;
04452 zzBLOCK(zztasp1);
04453 zzMake0;
04454 {
04455 parser_generic_reduction( context );
04456 zzEXIT(zztasp1);
04457 return;
04458 fail:
04459 zzEXIT(zztasp1);
04460 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
04461 zzresynch(setwd12, 0x8);
04462 }
04463 }
04464
04465 void
04466 #ifdef __STDC__
04467 parser_csrd_shared( ParserContext &context )
04468 #else
04469 parser_csrd_shared(context)
04470 ParserContext &context ;
04471 #endif
04472 {
04473 zzRULE;
04474 zzBLOCK(zztasp1);
04475 zzMake0;
04476 {
04477 parser_generic_shared( context );
04478 zzEXIT(zztasp1);
04479 return;
04480 fail:
04481 zzEXIT(zztasp1);
04482 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
04483 zzresynch(setwd12, 0x10);
04484 }
04485 }
04486
04487 void
04488 #ifdef __STDC__
04489 parser_convex_directive( ParserContext &context )
04490 #else
04491 parser_convex_directive(context)
04492 ParserContext &context ;
04493 #endif
04494 {
04495 zzRULE;
04496 zzBLOCK(zztasp1);
04497 zzMake0;
04498 {
04499 {
04500 zzBLOCK(zztasp2);
04501 zzMake0;
04502 {
04503 if ( (LA(1)==92) ) {
04504 parser_convex_private( context );
04505 }
04506 else {
04507 if ( (LA(1)==90) ) {
04508 parser_convex_begin( context );
04509 }
04510 else {
04511 if ( (LA(1)==91) ) {
04512 parser_convex_end( context );
04513 }
04514 else {
04515 if ( (LA(1)==70) ) {
04516 parser_convex_last_value( context );
04517 }
04518 else {
04519 if ( (
04520 LA(1)==93) ) {
04521 parser_convex_parallel( context );
04522 }
04523 else {
04524 if ( (LA(1)==77) ) {
04525 parser_convex_reduction( context );
04526 }
04527 else {zzFAIL(1,zzerr16,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
04528 }
04529 }
04530 }
04531 }
04532 }
04533 zzEXIT(zztasp2);
04534 }
04535 }
04536 zzEXIT(zztasp1);
04537 return;
04538 fail:
04539 zzEXIT(zztasp1);
04540 zzsyn(zzMissText, zzBadTok, "Convex directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04541 zzresynch(setwd12, 0x20);
04542 }
04543 }
04544
04545 void
04546 #ifdef __STDC__
04547 parser_convex_private( ParserContext &context )
04548 #else
04549 parser_convex_private(context)
04550 ParserContext &context ;
04551 #endif
04552 {
04553 zzRULE;
04554 zzBLOCK(zztasp1);
04555 zzMake0;
04556 {
04557
04558 ExpressionList *lvalues = 0;
04559 Statement *s = 0;
04560 AssertPrivate *a = 0;
04561 zzmatch(92);
04562 a = 0;
04563
04564 if (context.s_next.stmt_class() == DO_STMT)
04565 s = &context.s_next;
04566
04567 if (s == 0)
04568 parse_error("DO_PRIVATE is not before a DO loop");
04569 else {
04570
04571 a = (AssertPrivate *)
04572 assertion_of_type( s->assertions(),
04573 AS_PRIVATE );
04574 if (a == 0) {
04575 a = new AssertPrivate;
04576 s->assertions().ins_last( a );
04577 }
04578 }
04579 zzCONSUME;
04580 {
04581 zzBLOCK(zztasp2);
04582 zzMake0;
04583 {
04584 if ( (LA(1)==46) ) {
04585 zzmatch(46); zzCONSUME;
04586 lvalues = parser_lvalue_list_with_commas( context.pgm.symtab() );
04587
04588 zzmatch(47); zzCONSUME;
04589 }
04590 zzEXIT(zztasp2);
04591 }
04592 }
04593 zzmatch(1);
04594
04595 if (a != 0)
04596 list_absorb(a->arg_list_guarded(), lvalues);
04597 else
04598 delete lvalues;
04599 zzCONSUME;
04600 zzEXIT(zztasp1);
04601 return;
04602 fail:
04603 zzEXIT(zztasp1);
04604 zzsyn(zzMissText, zzBadTok, "Convex PRIVATE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04605 zzresynch(setwd12, 0x40);
04606 }
04607 }
04608
04609 void
04610 #ifdef __STDC__
04611 parser_convex_begin( ParserContext &context )
04612 #else
04613 parser_convex_begin(context)
04614 ParserContext &context ;
04615 #endif
04616 {
04617 zzRULE;
04618 zzBLOCK(zztasp1);
04619 zzMake0;
04620 {
04621 zzmatch(90); zzCONSUME;
04622 {
04623 zzBLOCK(zztasp2);
04624 zzMake0;
04625 {
04626 if ( (LA(1)==57) ) {
04627 parser_convex_begin_block( context );
04628 }
04629 else {
04630 if ( (LA(1)==56) ) {
04631 parser_convex_begin_parallel( context );
04632 }
04633 else {zzFAIL(1,zzerr17,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
04634 }
04635 zzEXIT(zztasp2);
04636 }
04637 }
04638 zzEXIT(zztasp1);
04639 return;
04640 fail:
04641 zzEXIT(zztasp1);
04642 zzsyn(zzMissText, zzBadTok, "Convex BEGIN directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04643 zzresynch(setwd12, 0x80);
04644 }
04645 }
04646
04647 void
04648 #ifdef __STDC__
04649 parser_convex_end( ParserContext &context )
04650 #else
04651 parser_convex_end(context)
04652 ParserContext &context ;
04653 #endif
04654 {
04655 zzRULE;
04656 zzBLOCK(zztasp1);
04657 zzMake0;
04658 {
04659 zzmatch(91); zzCONSUME;
04660 {
04661 zzBLOCK(zztasp2);
04662 zzMake0;
04663 {
04664 if ( (
04665 LA(1)==57) ) {
04666 parser_convex_end_block( context );
04667 }
04668 else {
04669 if ( (LA(1)==56) ) {
04670 parser_convex_end_parallel( context );
04671 }
04672 else {zzFAIL(1,zzerr18,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
04673 }
04674 zzEXIT(zztasp2);
04675 }
04676 }
04677 zzEXIT(zztasp1);
04678 return;
04679 fail:
04680 zzEXIT(zztasp1);
04681 zzsyn(zzMissText, zzBadTok, "Convex END directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04682 zzresynch(setwd13, 0x1);
04683 }
04684 }
04685
04686 void
04687 #ifdef __STDC__
04688 parser_convex_begin_parallel( ParserContext &context )
04689 #else
04690 parser_convex_begin_parallel(context)
04691 ParserContext &context ;
04692 #endif
04693 {
04694 zzRULE;
04695 zzBLOCK(zztasp1);
04696 zzMake0;
04697 {
04698 parser_generic_begin_parallel( context );
04699 zzEXIT(zztasp1);
04700 return;
04701 fail:
04702 zzEXIT(zztasp1);
04703 zzsyn(zzMissText, zzBadTok, "Convex BEGIN PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04704 zzresynch(setwd13, 0x2);
04705 }
04706 }
04707
04708 void
04709 #ifdef __STDC__
04710 parser_convex_end_parallel( ParserContext &context )
04711 #else
04712 parser_convex_end_parallel(context)
04713 ParserContext &context ;
04714 #endif
04715 {
04716 zzRULE;
04717 zzBLOCK(zztasp1);
04718 zzMake0;
04719 {
04720 parser_generic_end_parallel( context );
04721 zzEXIT(zztasp1);
04722 return;
04723 fail:
04724 zzEXIT(zztasp1);
04725 zzsyn(zzMissText, zzBadTok, "Convex END PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04726 zzresynch(setwd13, 0x4);
04727 }
04728 }
04729
04730 void
04731 #ifdef __STDC__
04732 parser_convex_begin_block( ParserContext &context )
04733 #else
04734 parser_convex_begin_block(context)
04735 ParserContext &context ;
04736 #endif
04737 {
04738 zzRULE;
04739 zzBLOCK(zztasp1);
04740 zzMake0;
04741 {
04742 parser_generic_begin_block( context );
04743 zzEXIT(zztasp1);
04744 return;
04745 fail:
04746 zzEXIT(zztasp1);
04747 zzsyn(zzMissText, zzBadTok, "Convex BEGIN BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04748 zzresynch(setwd13, 0x8);
04749 }
04750 }
04751
04752 void
04753 #ifdef __STDC__
04754 parser_convex_end_block( ParserContext &context )
04755 #else
04756 parser_convex_end_block(context)
04757 ParserContext &context ;
04758 #endif
04759 {
04760 zzRULE;
04761 zzBLOCK(zztasp1);
04762 zzMake0;
04763 {
04764 parser_generic_end_block( context );
04765 zzEXIT(zztasp1);
04766 return;
04767 fail:
04768 zzEXIT(zztasp1);
04769 zzsyn(zzMissText, zzBadTok, "Convex END BLOCK directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04770 zzresynch(setwd13, 0x10);
04771 }
04772 }
04773
04774 void
04775 #ifdef __STDC__
04776 parser_convex_last_value( ParserContext &context )
04777 #else
04778 parser_convex_last_value(context)
04779 ParserContext &context ;
04780 #endif
04781 {
04782 zzRULE;
04783 zzBLOCK(zztasp1);
04784 zzMake0;
04785 {
04786 parser_generic_last_value( context );
04787 zzEXIT(zztasp1);
04788 return;
04789 fail:
04790 zzEXIT(zztasp1);
04791 zzsyn(zzMissText, zzBadTok, "Convex LAST VALUE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04792 zzresynch(setwd13, 0x20);
04793 }
04794 }
04795
04796 void
04797 #ifdef __STDC__
04798 parser_convex_parallel( ParserContext &context )
04799 #else
04800 parser_convex_parallel(context)
04801 ParserContext &context ;
04802 #endif
04803 {
04804 zzRULE;
04805 zzBLOCK(zztasp1);
04806 zzMake0;
04807 {
04808 zzmatch(93); zzCONSUME;
04809 zzmatch(1);
04810
04811 force_parallel(context, 0, "FORCE_PARALLEL");
04812 zzCONSUME;
04813 zzEXIT(zztasp1);
04814 return;
04815 fail:
04816 zzEXIT(zztasp1);
04817 zzsyn(zzMissText, zzBadTok, "Convex FORCE_PARALLEL directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04818 zzresynch(setwd13, 0x40);
04819 }
04820 }
04821
04822 void
04823 #ifdef __STDC__
04824 parser_convex_reduction( ParserContext &context )
04825 #else
04826 parser_convex_reduction(context)
04827 ParserContext &context ;
04828 #endif
04829 {
04830 zzRULE;
04831 zzBLOCK(zztasp1);
04832 zzMake0;
04833 {
04834 parser_generic_reduction( context );
04835 zzEXIT(zztasp1);
04836 return;
04837 fail:
04838 zzEXIT(zztasp1);
04839 zzsyn(zzMissText, zzBadTok, "Convex REDUCTION directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04840 zzresynch(setwd13, 0x80);
04841 }
04842 }
04843
04844 void
04845 #ifdef __STDC__
04846 parser_sgi_directive( ParserContext &context )
04847 #else
04848 parser_sgi_directive(context)
04849 ParserContext &context ;
04850 #endif
04851 {
04852 zzRULE;
04853 zzBLOCK(zztasp1);
04854 zzMake0;
04855 {
04856 parser_sgi_doacross( context );
04857 zzEXIT(zztasp1);
04858 return;
04859 fail:
04860 zzEXIT(zztasp1);
04861 zzsyn(zzMissText, zzBadTok, "SGI directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
04862 zzresynch(setwd14, 0x1);
04863 }
04864 }
04865
04866 void
04867 #ifdef __STDC__
04868 parser_sgi_doacross( ParserContext &context )
04869 #else
04870 parser_sgi_doacross(context)
04871 ParserContext &context ;
04872 #endif
04873 {
04874 zzRULE;
04875 zzBLOCK(zztasp1);
04876 zzMake0;
04877 {
04878
04879 ExpressionList *pri_values = 0;
04880 ExpressionList *red_values = 0;
04881 ExpressionList *shr_values = 0;
04882 ExpressionList *las_values = 0;
04883 Expression *if_clause = 0;
04884
04885 Statement *s = 0;
04886
04887 if (context.s_next.stmt_class() == DO_STMT)
04888 s = &context.s_next;
04889 {
04890 zzBLOCK(zztasp2);
04891 zzMake0;
04892 {
04893 while ( 1 ) {
04894 if ( (LA(1)==48) ) {
04895 {
04896 zzBLOCK(zztasp3);
04897 zzMake0;
04898 {
04899 zzmatch(48); zzCONSUME;
04900 zzEXIT(zztasp3);
04901 }
04902 }
04903 }
04904 else {
04905 if ( (LA(1)==94) ) {
04906 {
04907 zzBLOCK(zztasp3);
04908 zzMake0;
04909 {
04910 zzmatch(94); zzCONSUME;
04911 zzmatch(46); zzCONSUME;
04912 las_values = parser_lvalue_list_with_commas( context.pgm.symtab() );
04913
04914 zzmatch(47); zzCONSUME;
04915 zzEXIT(zztasp3);
04916 }
04917 }
04918 }
04919 else {
04920 if ( (LA(1)==95) ) {
04921 {
04922 zzBLOCK(zztasp3);
04923 zzMake0;
04924 {
04925 zzmatch(95); zzCONSUME;
04926 zzmatch(46); zzCONSUME;
04927 pri_values = parser_lvalue_list_with_commas( context.pgm.symtab() );
04928
04929 zzmatch(47); zzCONSUME;
04930 zzEXIT(zztasp3);
04931 }
04932 }
04933 }
04934 else {
04935 if ( (
04936 LA(1)==96) ) {
04937 {
04938 zzBLOCK(zztasp3);
04939 zzMake0;
04940 {
04941 zzmatch(96); zzCONSUME;
04942 zzmatch(46); zzCONSUME;
04943 shr_values = parser_lvalue_list_with_commas( context.pgm.symtab() );
04944
04945 zzmatch(47); zzCONSUME;
04946 zzEXIT(zztasp3);
04947 }
04948 }
04949 }
04950 else {
04951 if ( (LA(1)==97) ) {
04952 {
04953 zzBLOCK(zztasp3);
04954 zzMake0;
04955 {
04956 zzmatch(97); zzCONSUME;
04957 zzmatch(46); zzCONSUME;
04958 if_clause = parser_expression( context.pgm.symtab() );
04959
04960 zzmatch(47); zzCONSUME;
04961 zzEXIT(zztasp3);
04962 }
04963 }
04964 }
04965 else {
04966 if ( (LA(1)==77) ) {
04967 {
04968 zzBLOCK(zztasp3);
04969 zzMake0;
04970 {
04971 zzmatch(77); zzCONSUME;
04972 zzmatch(46); zzCONSUME;
04973 red_values = parser_lvalue_list_with_commas( context.pgm.symtab() );
04974
04975 zzmatch(47); zzCONSUME;
04976 zzEXIT(zztasp3);
04977 }
04978 }
04979 }
04980 else break;
04981 }
04982 }
04983 }
04984 }
04985 }
04986 zzLOOP(zztasp2);
04987 }
04988 zzEXIT(zztasp2);
04989 }
04990 }
04991 zzmatch(1);
04992
04993 if (s == 0)
04994 parse_error("C$DOACROSS is not before a DO loop");
04995 else {
04996 AssertParallel *a_par = (AssertParallel *)
04997 assertion_of_type(s->assertions(), AS_PARALLEL);
04998 if (a_par == 0) {
04999 a_par = new AssertParallel;
05000 a_par->arg_list_guarded().ins_first( s->index().clone() );
05001 s->assertions().ins_last( a_par );
05002 }
05003
05004 AssertPrivate *a_pri = (AssertPrivate *)
05005 assertion_of_type(s->assertions(), AS_PRIVATE);
05006 if (a_pri == 0 && (pri_values != 0 || las_values != 0)) {
05007 a_pri = new AssertPrivate;
05008 s->assertions().ins_last( a_pri );
05009 }
05010
05011 AssertShared *a_shr = (AssertShared *)
05012 assertion_of_type(s->assertions(), AS_SHARED);
05013 if (a_shr == 0 && (shr_values != 0)) {
05014 a_shr = new AssertShared;
05015 s->assertions().ins_last( a_shr );
05016 }
05017
05018 AssertReduction *a_red = (AssertReduction *)
05019 assertion_of_type(s->assertions(), AS_REDUCTION);
05020 if (a_red == 0 && (red_values != 0)) {
05021 a_red = new AssertReduction;
05022 s->assertions().ins_last( a_red );
05023 }
05024
05025 AssertParallelCondition *a_parcon = (AssertParallelCondition *)
05026 assertion_of_type(s->assertions(), AS_PARCONDITION);
05027 if (a_parcon == 0 && (if_clause != 0)) {
05028 a_parcon = new AssertParallelCondition;
05029 s->assertions().ins_last( a_parcon );
05030 }
05031
05032 AssertLastValue *a_las = (AssertLastValue *)
05033 assertion_of_type(s->assertions(), AS_LASTVALUE);
05034 if (a_las == 0 && (las_values != 0)) {
05035 a_las = new AssertLastValue;
05036 s->assertions().ins_last( a_las );
05037 }
05038
05039 if (las_values != 0) {
05040 list_absorb(a_pri->arg_list_guarded(),
05041 (ExpressionList *)las_values->listable_clone());
05042 list_absorb(a_las->arg_list_guarded(), las_values);
05043 }
05044
05045 if (red_values != 0)
05046 list_absorb(a_red->arg_list_guarded(), red_values);
05047
05048 if (if_clause != 0)
05049 a_parcon->arg_list_guarded().ins_last(if_clause);
05050
05051 if (shr_values != 0)
05052 list_absorb(a_shr->arg_list_guarded(), shr_values);
05053
05054 if (pri_values != 0)
05055 list_absorb(a_pri->arg_list_guarded(), pri_values);
05056 }
05057 zzCONSUME;
05058 zzEXIT(zztasp1);
05059 return;
05060 fail:
05061 zzEXIT(zztasp1);
05062 zzsyn(zzMissText, zzBadTok, "SGI DOACROSS directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
05063 zzresynch(setwd14, 0x2);
05064 }
05065 }
05066
05067 void
05068 #ifdef __STDC__
05069 parser_cray_directive( ParserContext &context )
05070 #else
05071 parser_cray_directive(context)
05072 ParserContext &context ;
05073 #endif
05074 {
05075 zzRULE;
05076 zzBLOCK(zztasp1);
05077 zzMake0;
05078 {
05079 if ( (LA(1)==78) ) {
05080 parser_cray_shared( context );
05081 }
05082 else {
05083 if ( (LA(1)==98) ) {
05084 parser_cray_private( context );
05085 }
05086 else {zzFAIL(1,zzerr19,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
05087 }
05088 zzEXIT(zztasp1);
05089 return;
05090 fail:
05091 zzEXIT(zztasp1);
05092 zzsyn(zzMissText, zzBadTok, "CRAY directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
05093 zzresynch(setwd14, 0x4);
05094 }
05095 }
05096
05097 void
05098 #ifdef __STDC__
05099 parser_distr_expression( int dim, DistributeExpr *e )
05100 #else
05101 parser_distr_expression(dim,e)
05102 int dim;
05103 DistributeExpr *e ;
05104 #endif
05105 {
05106 zzRULE;
05107 zzBLOCK(zztasp1);
05108 zzMake0;
05109 {
05110
05111 Expression *ew = 0;
05112 Expression *eb = 0;
05113 int block = 0;
05114 {
05115 zzBLOCK(zztasp2);
05116 zzMake0;
05117 {
05118 if ( (
05119 LA(1)==F_NUM_CONST) ) {
05120 zzmatch(F_NUM_CONST);
05121
05122 ew = constant(zzaArg(zztasp2,1 ).text);
05123 if (ew->type().data_type() != INTEGER_TYPE) {
05124 delete ew;
05125 p_abort("Distribution must be a integer");
05126 }
05127 zzCONSUME;
05128 }
05129 zzEXIT(zztasp2);
05130 }
05131 }
05132 zzmatch(49); zzCONSUME;
05133 {
05134 zzBLOCK(zztasp2);
05135 zzMake0;
05136 {
05137 if ( (LA(1)==57) ) {
05138 zzmatch(57);
05139 block = 1;
05140 zzCONSUME;
05141 {
05142 zzBLOCK(zztasp3);
05143 zzMake0;
05144 {
05145 if ( (LA(1)==46) ) {
05146 zzmatch(46); zzCONSUME;
05147 zzmatch(F_NUM_CONST); zzCONSUME;
05148 zzmatch(47);
05149
05150 eb = constant(zzaArg(zztasp3,2 ).text);
05151 if (eb->type().data_type() != INTEGER_TYPE) {
05152 delete eb;
05153 p_abort("Distribution must be a integer");
05154 }
05155 zzCONSUME;
05156 }
05157 zzEXIT(zztasp3);
05158 }
05159 }
05160 }
05161 zzEXIT(zztasp2);
05162 }
05163 }
05164
05165 if (block)
05166 if (eb) {
05167 if (ew) {
05168 e->set_distribute(dim, CYCLIC_DISTR,
05169 ew->value(), eb->value());
05170 delete ew;
05171 }
05172 else
05173 e->set_distribute(dim, CYCLIC_DISTR, 1, eb->value());
05174 delete eb;
05175 }
05176 else
05177 if (ew) {
05178 e->set_distribute(dim, BLOCK_DISTR, ew->value());
05179 delete ew;
05180 }
05181 else
05182 e->set_distribute(dim, BLOCK_DISTR, 1);
05183 else
05184 if (ew) {
05185 delete ew;
05186 p_abort("Degenerate Distribution can't have weight");
05187 }
05188 else
05189 e->set_distribute(dim, DEGEN_DISTR);
05190 zzEXIT(zztasp1);
05191 return;
05192 fail:
05193 zzEXIT(zztasp1);
05194 zzsyn(zzMissText, zzBadTok, "Each Distribution Expression", zzMissSet, zzMissTok, zzErrk, zzBadText);
05195 zzresynch(setwd14, 0x8);
05196 }
05197 }
05198
05199 DistributeExpr *
05200 #ifdef __STDC__
05201 parser_distr_expression_list(void)
05202 #else
05203 parser_distr_expression_list()
05204 #endif
05205 {
05206 DistributeExpr * _retv;
05207 zzRULE;
05208 zzBLOCK(zztasp1);
05209 zzMake0;
05210 {
05211
05212 int dim = 1;
05213 _retv = new DistributeExpr;
05214 parser_distr_expression( dim, _retv );
05215
05216 dim++;
05217 {
05218 zzBLOCK(zztasp2);
05219 zzMake0;
05220 {
05221 while ( (LA(1)==48) ) {
05222 zzmatch(48); zzCONSUME;
05223 parser_distr_expression( dim, _retv );
05224
05225 dim++;
05226 zzLOOP(zztasp2);
05227 }
05228 zzEXIT(zztasp2);
05229 }
05230 }
05231 zzEXIT(zztasp1);
05232 return _retv;
05233 fail:
05234 zzEXIT(zztasp1);
05235 zzsyn(zzMissText, zzBadTok, "Distribution Expression List", zzMissSet, zzMissTok, zzErrk, zzBadText);
05236 zzresynch(setwd14, 0x10);
05237 return _retv;
05238 }
05239 }
05240
05241 ExpressionList *
05242 #ifdef __STDC__
05243 parser_cray_shared_expr_list( Symtab &symtab )
05244 #else
05245 parser_cray_shared_expr_list(symtab)
05246 Symtab &symtab ;
05247 #endif
05248 {
05249 ExpressionList * _retv;
05250 zzRULE;
05251 zzBLOCK(zztasp1);
05252 zzMake0;
05253 {
05254
05255 Expression *e_id = 0;
05256 DistributeExpr *e_dist = 0;
05257 _retv = new ExpressionList;
05258 e_id = parser_sym_ref( symtab );
05259
05260 {
05261 zzBLOCK(zztasp2);
05262 zzMake0;
05263 {
05264 if ( (LA(1)==46) ) {
05265 zzmatch(46); zzCONSUME;
05266 e_dist = parser_distr_expression_list();
05267
05268 zzmatch(47); zzCONSUME;
05269 }
05270 zzEXIT(zztasp2);
05271 }
05272 }
05273
05274 append_shared_data_objects(e_id, e_dist, _retv);
05275 {
05276 zzBLOCK(zztasp2);
05277 zzMake0;
05278 {
05279 while ( (
05280 LA(1)==48) ) {
05281 zzmatch(48);
05282
05283 e_id = 0; e_dist = 0;
05284 zzCONSUME;
05285 e_id = parser_sym_ref( symtab );
05286
05287 {
05288 zzBLOCK(zztasp3);
05289 zzMake0;
05290 {
05291 if ( (LA(1)==46) ) {
05292 zzmatch(46); zzCONSUME;
05293 e_dist = parser_distr_expression_list();
05294
05295 zzmatch(47); zzCONSUME;
05296 }
05297 zzEXIT(zztasp3);
05298 }
05299 }
05300
05301 append_shared_data_objects(e_id, e_dist, _retv);
05302 zzLOOP(zztasp2);
05303 }
05304 zzEXIT(zztasp2);
05305 }
05306 }
05307 zzEXIT(zztasp1);
05308 return _retv;
05309 fail:
05310 zzEXIT(zztasp1);
05311 zzsyn(zzMissText, zzBadTok, "Cray Shared object Expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
05312 zzresynch(setwd14, 0x20);
05313 return _retv;
05314 }
05315 }
05316
05317 void
05318 #ifdef __STDC__
05319 parser_cray_shared( ParserContext &context )
05320 #else
05321 parser_cray_shared(context)
05322 ParserContext &context ;
05323 #endif
05324 {
05325 zzRULE;
05326 zzBLOCK(zztasp1);
05327 zzMake0;
05328 {
05329
05330 ExpressionList *list = 0;
05331 Statement *s = 0;
05332 AssertShared *a = 0;
05333 zzmatch(78);
05334 s = &context.pgm.stmts().first();
05335 a = (AssertShared *) assertion_of_type( s->assertions(),
05336 AS_SHARED );
05337 if (a == 0) {
05338 a = new AssertShared;
05339 s->assertions().ins_last( a );
05340 }
05341 zzCONSUME;
05342 list = parser_cray_shared_expr_list( context.pgm.symtab() );
05343
05344 zzmatch(1);
05345
05346 list_absorb(a->arg_list_guarded(), list);
05347 zzCONSUME;
05348 zzEXIT(zztasp1);
05349 return;
05350 fail:
05351 zzEXIT(zztasp1);
05352 zzsyn(zzMissText, zzBadTok, "CRAY SHARED directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
05353 zzresynch(setwd14, 0x40);
05354 }
05355 }
05356
05357 ExpressionList *
05358 #ifdef __STDC__
05359 parser_cray_private_expr_list( Symtab &symtab )
05360 #else
05361 parser_cray_private_expr_list(symtab)
05362 Symtab &symtab ;
05363 #endif
05364 {
05365 ExpressionList * _retv;
05366 zzRULE;
05367 zzBLOCK(zztasp1);
05368 zzMake0;
05369 {
05370
05371 Expression *e_id = 0;
05372 _retv = new ExpressionList;
05373 e_id = parser_sym_ref( symtab );
05374
05375
05376
05377
05378
05379
05380 p_assert((e_id && e_id->op() == ID_OP),
05381 "Illegal cray private symbol declaration");
05382 _retv->ins_last(e_id);
05383 {
05384 zzBLOCK(zztasp2);
05385 zzMake0;
05386 {
05387 while ( (LA(1)==48) ) {
05388 zzmatch(48);
05389
05390 e_id = 0;
05391 zzCONSUME;
05392 e_id = parser_sym_ref( symtab );
05393
05394
05395 p_assert((e_id && e_id->op() == ID_OP),
05396 "Illegal cray private symbol declaration");
05397
05398
05399 _retv->ins_last(e_id);
05400 zzLOOP(zztasp2);
05401 }
05402 zzEXIT(zztasp2);
05403 }
05404 }
05405 zzEXIT(zztasp1);
05406 return _retv;
05407 fail:
05408 zzEXIT(zztasp1);
05409 zzsyn(zzMissText, zzBadTok, "Cray Private object Expression list", zzMissSet, zzMissTok, zzErrk, zzBadText);
05410 zzresynch(setwd14, 0x80);
05411 return _retv;
05412 }
05413 }
05414
05415 void
05416 #ifdef __STDC__
05417 parser_cray_private( ParserContext &context )
05418 #else
05419 parser_cray_private(context)
05420 ParserContext &context ;
05421 #endif
05422 {
05423 zzRULE;
05424 zzBLOCK(zztasp1);
05425 zzMake0;
05426 {
05427
05428 ExpressionList *list = 0;
05429 Statement *s = 0;
05430 AssertPrivate*a = 0;
05431 zzmatch(98);
05432 s = &context.pgm.stmts().first();
05433 a = (AssertPrivate *) assertion_of_type( s->assertions(),
05434 AS_PRIVATE );
05435 if (a == 0) {
05436 a = new AssertPrivate;
05437 s->assertions().ins_last( a );
05438 }
05439 zzCONSUME;
05440 list = parser_cray_private_expr_list( context.pgm.symtab() );
05441
05442 zzmatch(1);
05443
05444 list_absorb(a->arg_list_guarded(), list);
05445 zzCONSUME;
05446 zzEXIT(zztasp1);
05447 return;
05448 fail:
05449 zzEXIT(zztasp1);
05450 zzsyn(zzMissText, zzBadTok, "CRAY PE_PRIVATE directive", zzMissSet, zzMissTok, zzErrk, zzBadText);
05451 zzresynch(setwd15, 0x1);
05452 }
05453 }