Polaris: parser.cc Source File

parser.cc

Go to the documentation of this file.
00001 /*
00002  * A n t l r  T r a n s l a t i o n  H e a d e r
00003  *
00004  * Terence Parr, Will Cohen, and Hank Dietz: 1989-1994
00005  * Purdue University Electrical Engineering
00006  * With AHPCRC, University of Minnesota
00007  * ANTLR Version 1.23
00008  */
00009 #include <stdio.h>
00010 #define ANTLR_VERSION   123
00011 
00012 
00013 /// We want to provide our own error-printing routine, so define this symbol:
00014 /// #define USER_ZZSYN
00015 /// removed--maybe add later -- s.a.w.
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 /// ExpressionList is simply a List<Expression>, but we will use it
00028 /// instead of List<Expression> in order to keep from having to 
00029 /// drag in List.h and Expression.h into all the header files.
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     /// ...  nothing to do
00078 };
00079 
00080 Expression *make_afi_node(Expression *arg1, Expression *arg2);
00081 void parse_error(const char *);  
00082 
00083   
00084 
00085 
00086 /// Aborb 'to_append_and_delete' into 'source', and delete
00087 /// 'to_append_and_delete' when done.
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         /// ...  Go ahead and delete the secondary list
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 /// Make sure that all expressions in the list are of the given types.  If
00111 /// one is found that is not of the given type, it is deleted, and an error
00112 /// message is given through parse_error(err_message)
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             /// ...  We're okay -- nothing to do
00124         }
00125         else {
00126         /// ...  Error discovered
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             /// ...  Remove the one that was an error
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 /// Make sure that all expressions in the list are either
00179 /// scalar variables (if 'can_be_scalar_var') or array elements
00180 /// (if 'can_be_array_elem'), or entire array reference (if 
00181 /// 'can_be_entire_array), or all, as given.
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; /// ...  Okay -- try next expression
00195 }
00196 else if ( can_be_array_elem && iter.current().op() == ARRAY_REF_OP ) {
00197 continue; /// ...  Okay -- try next expression
00198 }
00199 else if ( can_be_entire_array && is_array_symbol( iter.current() ) ) {
00200 continue; /// ...  Okay -- try next expression
00201 }
00202 else {
00203 /// Error discovered
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             /// ...  Remove the one that was an error
00212 iter.del();
00213 }
00214 }
00215 }
00216 
00217   
00218 
00219 
00220 /// Given the following format of Fortran expression:
00221 ///   arg1 ( arg2 ) /* (where arg2 should be a comma-expr) */
00222 /// return an appropriate Expression for this expression.
00223 /// Depending on the type of arg1, this may take one of several forms:
00224 ///   -- intrinsic function call
00225 ///   -- function call
00226 ///   -- substring expression
00227 ///   -- array ref
00228 
00229 Expression *
00230 make_afi_node(Expression *arg1, Expression *arg2) 
00231 {
00232     if (arg1 == 0 || arg2 == 0) { 
00233         /// ...  must be syntax error -- return NULL
00234         if (arg1) 
00235         delete arg1;
00236         if (arg2) 
00237         delete arg2;
00238         
00239         return 0;
00240     }
00241     
00242     /// ...  arg1 MUST be an ID_OP, or else of type character, 
00243     /// ...  else there is an error
00244     
00245     if (arg1->op() != ID_OP) {
00246         if (arg1->type().data_type() == CHARACTER_TYPE) {
00247             /// ...  We have a substring expression
00248             return substring(arg1, arg2);
00249         }
00250         else {
00251             /// ...  Error
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         /// ...  Here we are guaranteed success, but there are
00275         /// ...  two possibilities--intrinsic call or function call
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             /// ...  We need more exact checks here--ie. number of dimensions, etc.
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 //_ Append a new shared scalar or array to list after verifying its correctness.
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         /// ...  e_dist is DISTRIBUTE_OP only with distributions 
00338         /// ...  and e_id must be a shared array id expression to
00339         /// ...  be added to e_dist with its dimension.
00340         
00341     p_assert((e_id && e_id->op() == ID_OP), "Illegal shared array name");
00342         
00343     e_dist->symbol(e_id->symbol());
00344         /// ...  Now, array name and dimension is added.
00345         
00346     p_assert( e_dist->is_well_defined(), "Distribution is not well defined" );
00347         /// ...  Distribution must match the symbol declaration.
00348         
00349     delete e_id;
00350         list->ins_last(e_dist);
00351     }
00352     else {
00353         /// ...  e_id must be a shared scalar id expression
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     // zzerr = fbzzerr; /// ...  Take over lexical error function
00369     /// ...  -- removed for now -- s.a.w.
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         /// ...  Create the context
00385         
00386         ParserContext context(pgm, s_prev, s_next);
00387         
00388         /// ...  Note that we send in 'dir' directly as the 'line'
00389         /// ...  parameter, since it is used by comments, and we do
00390         /// ...  not want the prepass to change anything inside a
00391         /// ...  comment which is not a directive.
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         /// ...  Skip past the start of comment character.
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 /// If assertion_ref != 0 and e != 0, then 'e' is inserted into
00435 ///   assertion_ref's arg_list.  Otherwise, 'e' is garbage
00436 ///   collected (deleted)
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     /// ...  We have a comment for sure, but the syntax of
00524     /// ...    Fortran vs. modern token creation makes it
00525     /// ...    difficult to grab the text of a comment line
00526     //   using normal parsing/lexing techniques,
00527     /// ...    so we will cheat and grab it from our
00528     /// ...    parameter 'line'
00529     {
00530         AssertComment *a = new AssertComment;
00531         
00532                         context.s_next.assertions().ins_last( a );
00533         
00534                         const char *p = line;
00535         
00536                         /// ...  Skip past the start of comment character.
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; /// ...  Ignore invalid argument
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                 /// ...  We can't tell yet if it's a function
01162                 /// ...  call or an array reference--leave the
01163                 /// ...  decision to run-time
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             /// ...  No expression found -- return EMPTY comma-expr
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         /// ...  Not a triplet
01361         p_assert(exprs[1] == 0 && exprs[2] == 0,
01362         "Internal Error");
01363         _retv = exprs[0]; exprs[0] = 0;
01364     }
01365     else {
01366     /// ...  Triplet
01367     /// ...  If first two args not specified, use
01368     /// ...  an OmegaExpr instead.  If stride not
01369     /// ...  specified, leave it out of the colon
01370     /// ...  expression altogether
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); /// ...  Dummy to return
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); /// ...  dummy return
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, /// ...  can_be_scalar_var
01679     True, /// ...  can_be_array_elem
01680     True  /// ...  can_be_entire_array
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         /// ...  Search for an existing PRIVATE assertion
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; /// ...  No assertion to stick these into
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         /// ...  Search for an existing RELATION assertion
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; /// ...  No assertion to stick these into
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         /// ...  Search for an existing SAFE_CONDITION assertion
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; /// ...  No assertion to stick these into
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                     /// ...  Find the appropriate DO statement
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                     /// ...  Find appropriate DO
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                     /// ...  WARNING: this is a private: member access.
02055     /// ...  Make sure you know what you are doing.
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; /// ...  No assertion to stick these into
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                     /// ...  WARNING: this is a private: member access.
02452     /// ...  Make sure you know what you are doing.
02453     
02454                     Directive::_ins_after(context.pgm.stmts(), s_end_block, 
02455     s, "BLOCK_EXIT" );
02456     
02457                     /// ...  Patch up the follow links
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         /// ...  Search for an existing SHARED assertion
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; /// ...  No assertion to stick these into
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         /// ...  Search for an existing NO_DEPENDENCE assertion
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; /// ...  No assertion to stick these into
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                /// ...  Search for an existing SIDE_EFFECT_FREE assertion
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; /// ...  No assertion to stick these into
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            /// ...  Strip the quotes off the name (substr function)
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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; /// ...  No assertion to stick these into
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         /// ...  Search for an existing PRIVATE assertion
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; /// ...  No assertion to stick these into
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);  /// ...  Must be a integer
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);  /// ...  Must be a integer
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     /// ...  e_id must be a private scalar id expression
05377     
05378           /// ... p_assert((e_id && is_scalar_var(*e_id)),
05379     /// ...         "Illegal private scalar name");
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             /// ... p_assert((e_id && is_scalar_var(*e_id)),
05398             /// ...       "Illegal private scalar name");
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 }
 © 1995-2005 University of Illinois, Urbana-Champaign. All rights reserved.  Fri Mar 25 23:06:01 2005