📄 mrhoist.c
字号:
/* * mrhoist.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33MR10 * */#include <stdio.h>#ifdef __cplusplus#ifndef __STDC__#define __STDC__#endif#endif#include "set.h"#include "syn.h"#include "hash.h"#include "generic.h"#include "dlgdef.h"#include <ctype.h>#ifdef __STDC__void dumppred(Predicate *);#elsevoid dumppred();#endif/* Try to determine whether predicate "first" is true for all cases where "second" is true. Comparison takes place without regard to context. Assumes that predicate symbols have been expanded. Assumes that there are no NAND or NOR nodes*/#ifdef __STDC__int MR_secondPredicateUnreachable(Predicate *first,Predicate *second)#elseint MR_secondPredicateUnreachable(first,second) Predicate *first; Predicate *second;#endif{ Predicate *f; Predicate *s; if (first == NULL) { return 1; } else if (second == NULL) { return 0; } else if (first->down == NULL && second->down == NULL) { if (first->source == second->source && first->inverted == second->inverted) { return 1; /* look identical - will never reach alt2 */ } else { return 0; /* look different */ }; } else if (first->down == NULL && second->down != NULL) { if (second->expr == PRED_AND_LIST) { /* unreachable if first covers any child of second */ for (s=second->down; s != NULL; s=s->right) { if (MR_secondPredicateUnreachable(first,s)) { return 1; }; }; return 0; } else if (second->expr == PRED_OR_LIST) { /* unreachable if first covers every child of second */ for (s=second->down; s != NULL; s=s->right) { if (!MR_secondPredicateUnreachable(first,s)) { return 0; }; }; return 1; } else { require (0,"Illegal pred->expr"); }; } else if (first->down != NULL && second->down == NULL) { if (first->expr == PRED_AND_LIST) { /* unreachable if every child of first covers second */ for (f=first->down; f != NULL; f=f->right) { if (!MR_secondPredicateUnreachable(f,second)) { return 0; }; }; return 1; } else if (first->expr == PRED_OR_LIST) { /* unreachable if any child of first covers second */ for (f=first->down; f != NULL; f=f->right) { if (MR_secondPredicateUnreachable(f,second)) { return 1; }; }; return 0; } else { require (0,"Illegal predicate->expr"); }; } else { if (first->expr == PRED_AND_LIST && second->expr == PRED_AND_LIST) { /* unreachable if each child of first covers at least one child of second */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) goto A_next_f; }; return 0;A_next_f: continue; }; return 1; } else if (first->expr == PRED_AND_LIST && second->expr == PRED_OR_LIST) { /* unreachable if each child of first covers ALL of second's children */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (!MR_secondPredicateUnreachable(f,s)) return 0; }; }; return 1; } else if (first->expr == PRED_OR_LIST && second->expr == PRED_AND_LIST) { /* unreachable if any child of second is covered by any child of first */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) return 1; }; }; return 0; } else if (first->expr == PRED_OR_LIST && second->expr == PRED_OR_LIST) { /* unreachable if every child of second is covered by some child of first */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) goto B_next_f; }; return 0;B_next_f: continue; }; return 1; } else { require (0,"Illegal predicate->expr"); }; };}#ifdef __STDC__void MR_xxxIndent(FILE *f,int depth)#elsevoid MR_xxxIndent(f,depth) FILE *f; int depth;#endif{ int i; for (i=0; i<depth ; i++) { fprintf(f," "); };}#ifdef __STDC__void MR_stderrIndent(int depth)#elsevoid MR_stderrIndent(depth) int depth;#endif{ MR_xxxIndent(stderr,depth);}#ifdef __STDC__void MR_outputIndent(int depth)#elsevoid MR_outputIndent(depth) int depth;#endif{ MR_xxxIndent(output,depth);}#ifdef __STDC__void MR_set_reuse(set *s)#elsevoid MR_set_reuse(s) set *s;#endif{ set_free(*s); *s=empty;}#ifdef __STDC__void MR_dumpPredRuleRefStack(FILE *iounit,int indent)#elsevoid MR_dumpPredRuleRefStack(iounit,indent) FILE *iounit; int indent;#endif{ int i; int j; int count=MR_PredRuleRefStack.count; RuleRefNode *rrn=NULL; Junction *lastOne; if (count == 0) { fprintf(iounit,"empty\n"); return; }; for (i=0; i < count; i++) { rrn=(RuleRefNode *) MR_PredRuleRefStack.data[i]; for (j=0; j<indent; j++) fprintf(iounit," "); fprintf(iounit,"#%-2d in rule %s (line %d %s) to rule %s\n", i,rrn->rname,rrn->line,FileStr[rrn->file],rrn->text); }; lastOne=MR_ruleReferenced(rrn); if (lastOne != NULL) { for (j=0; j<indent; j++) fprintf(iounit," "); fprintf(iounit,"#%-2d in rule %s (line %d %s)\n", count,lastOne->rname,lastOne->line,FileStr[lastOne->file]); };}#ifdef __STDC__void MR_dumpTreeF(FILE *f,int depth,Tree *tree,int across)#elsevoid MR_dumpTreeF(f,depth,tree,across) FILE *f; Tree *tree; int depth; int across;#endif{ int newAcross=across; if (tree == NULL ) return; if (tree->down != NULL ) { fprintf(output,"\n"); MR_outputIndent(depth); fprintf(output, "(root ="); }; if (tree->token == ALT ) { fprintf(output," %-16s","Alt"); } else if (tree->token==EpToken ) { fprintf(output,"(%d)%13s",tree->v.rk," "); } else { fprintf(output," %-16s",TerminalString(tree->token)); }; if (tree->down != NULL) { fprintf(output,"\n"); MR_outputIndent(depth+1); MR_dumpTreeF(f,depth+1,tree->down,1); newAcross=0; fprintf(output,"\n"); MR_outputIndent(depth); fprintf(output,")"); }; if (newAcross > 3) { fprintf(output,"\n"); MR_outputIndent(depth); newAcross=0; }; MR_dumpTreeF(f,depth,tree->right,newAcross+1);}#ifdef __STDC__void MR_dumpTreeX(int depth,Tree *tree,int across)#elsevoid MR_dumpTreeX(depth,tree,across) Tree *tree; int depth; int across;#endif{ MR_dumpTreeF(output,depth,tree,across);}#ifdef __STDC__void MR_dumpTokenSet(FILE *f,int depth,set s)#elsevoid MR_dumpTokenSet(f,depth,s) FILE *f; int depth; set s;#endif{ int i; int j; unsigned *pdq; if (set_nil(s)) { fprintf(f,"\n"); MR_xxxIndent(f,depth+1); fprintf(f,"nil\n"); return; }; pdq=set_pdq(s); require(pdq != NULL,"set_pdq failed"); i=0; for (i=0 ; ; i=i+4) { fprintf(f,"\n"); MR_xxxIndent(f,depth+1); for (j=0; j < 4 ; j++) { if (pdq[i+j] == nil) break; fprintf(f," %-16s",TerminalString(pdq[i+j])); }; if (pdq[i+j] == nil) break; }; fprintf(f,"\n"); free( (char *) pdq);}#ifdef __STDC__void MR_dumpPred1(int depth,Predicate *p,int withContext)#elsevoid MR_dumpPred1(depth,p,withContext) int depth; Predicate *p; int withContext;#endif{ unsigned k; if (p == NULL) { MR_outputIndent(depth); fprintf(output,"The predicate is empty (or always true)\n\n"); return; }; if (p->down != NULL) { MR_outputIndent(depth); if (p->inverted) { if (p->expr == PRED_AND_LIST) fprintf(output,"%s NAND (not AND) expr\n\n"); if (p->expr == PRED_OR_LIST) fprintf(output,"%s NOR (not OR) expr\n\n"); } else { fprintf(output,"%s expr\n\n",p->expr); }; } else { MR_outputIndent(depth); fprintf(output,"pred %s <<%s>>?\n", (p->inverted ? " *not*" : ""), (p->expr == NULL ? "null expr" : p->expr)); MR_outputIndent(depth+1); fprintf(output," "); fprintf(output," depth=k=%d",p->k); if (p->source != NULL && p->source->guardpred) { fprintf(output," (\"=>\" guard)"); } if (p->source != NULL && p->source->ampersandPred != NULL) { fprintf(output," (\"&&\" guard)"); }; k=set_int(p->completionSet); if (k != nil) { fprintf(output," Incomplete Set at k=%d !",k); }; k=set_int(p->completionTree); if (k != nil) { fprintf(output," Incomplete Tree at k=%d !",k); }; if (p->source != NULL) { fprintf(output," rule %s line %d %s", p->source->rname,p->source->line,FileStr[p->source->file]); }; fprintf(output,"\n"); if (withContext && (HoistPredicateContext || ! set_nil(p->scontext[1]) || p->tcontext != NULL)) { if (p->k == 1) { MR_outputIndent(depth+1); fprintf(output,"set context: "); MR_dumpTokenSet(output,depth+1,p->scontext[1]); } if (p->k != 1) { MR_outputIndent(depth+1); fprintf(output,"tree context:"); if (p->tcontext == NULL) { fprintf(output," null"); } else { MR_dumpTreeX(depth+2,p->tcontext,0); }; fprintf(output,"\n"); }; }; fprintf(output,"\n"); }; if (p->down != NULL) { MR_dumpPred1(depth+1,p->down,withContext); }; if (p->right != NULL) { MR_dumpPred1(depth,p->right,withContext); };}#ifdef __STDC__void MR_dumpPred(Predicate *p,int withContext)#elsevoid MR_dumpPred(p,withContext) Predicate *p; int withContext;#endif{ MR_dumpPred1(0,p,withContext);}#ifdef __STDC__Tree * MR_make_tree_from_set(set s)#elseTree * MR_make_tree_from_set(s) set s;#endif{ Tree *t=NULL; Tree *node; Tree **tp=&t; int i; unsigned *pdq=set_pdq(s); if (pdq != NULL) { for (i=0 ; pdq[i] != nil ; i++) { node=tnode( (int) pdq[i]); *tp=node; tp=&(node->right); }; *tp=NULL; free ( (char *) pdq); }; return t;}#ifdef __STDC__void MR_check_pred_too_long(Predicate *p,set completion)#elsevoid MR_check_pred_too_long(p,completion) Predicate *p; set completion;#endif{ if (p != NULL && p->source != NULL && ! p->source->predTooLong) { if ( !set_nil(completion)) { p->source->predTooLong=1;warnFL("It is unusual (but ok) for a semantic predicate to test context past the end of its own rule", FileStr[p->source->file],p->source->line); }; };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -