4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SOFTWARE RIGHTS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Set (PCCTS) -- PCCTS is in the public domain. An individual or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * company may do whatever they wish with source code distributed with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS or the code generated by PCCTS, including the incorporation of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS, or its output, into commerical software.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We encourage users to develop software with PCCTS. However, we do ask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that credit is given to us for developing PCCTS. By "credit",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * we mean that if you incorporate our source code into one of your
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * programs (commercial product, research project, or otherwise) that you
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * acknowledge this fact somewhere in the documentation, research report,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * etc... If you like PCCTS and have developed a nice tool with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * output, please mention that you developed it using PCCTS. In
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * addition, we ask that this header remain intact in our source code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * As long as these guidelines are kept, we expect to continue enhancing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * this system and expect to make other tools available as they are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ANTLR 1.33MR10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ExceptionGroup **egArray=NULL; /* ExceptionGroup by BlkLevel */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic LabelEntry **leArray=NULL; /* LabelEntry by BlkLevel */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic Junction **altArray=NULL; /* start of alternates */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ExceptionGroup *lastEG=NULL; /* used in altFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void arrayCheck(void);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void arrayCheck();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Called to add an exception group for an alternative EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* EG for alternates already have their altID filled in */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerEG=egArray[i]; innerEG != NULL ; innerEG=nextEG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * for patching up the LabelEntry you might use an EG for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * current alternative - unlike patching up an alternative EG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * i.e. start the loop at BlkLevel rather than (BlkLevel+1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * fill it in only if the EG and the LE are for the very
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * same alternative if they're at the same BlkLevel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * it's easier to leave the LE on this list (filled in) rather than
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * trying to selectively remove it. It will eventually be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * removed anyway when the BlkLevel gets small enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * For the start of alternatives it is necessary to make a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * distinction between the exception group for the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * alternative and the "fallback" EG for the block which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * contains the alternative
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The fallback outerEG is used to handle the case where
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * no alternative of a block matches. In that case the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * signal is "NoViableAlt" (or "NoSemViableAlt" and the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * generator needs the EG of the block CONTAINING the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * current one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * rule: ( ( ( a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* first fill in the EG for the current alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* but leave it on the list in order to get the fallback EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if the EG is at the same LEVEL as the alternative then */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fill it in only if in the very same alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* rule: ( a */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* | c exception ... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if the EG is outside the alternative (e.g. BlkLevel < i) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* then it doesn't matter about the alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* rule: ( a */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* ) exception ... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("BlkLevel=%d i=%d altnum=%d CurAltNum=%d altID=%s\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlkLevel,i,innerAlt->curAltNum,CurAltNum_array[BlkLevel],eg->altID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->curAltNum == CurAltNum_array[BlkLevel]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* ocurs at a later pass then for the exception_label */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if an outerEG has been found then fill in the outer EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* remove if from the list when the BlkLevel gets smaller */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=0; i<arraySize ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call leFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerEG=egArray[i]; innerEG != NULL ; innerEG=nextEG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call leFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call altFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if an outerEG has been found then fill in the outer EG */