⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fset2.c

📁 本工具提供一个词法分析器和语法分析器的集成开发环境
💻 C
📖 第 1 页 / 共 4 页
字号:
    require (p != NULL,"context predicate's guardNodes == NULL");	rk = empty;	if (pred->k > 1 )	{		ConstrainSearch = 0;		ContextGuardTRAV = 1;		TRAV(p, pred->k, &rk, t);		ContextGuardTRAV = 0;		set_free(rk);		t = tshrink( t );		t = tflatten( t );		t = tleft_factor( t );        Tfree(pred->tcontext);		pred->tcontext = t;	}	else	{		REACH(p, 1, &rk, scontext);		require(set_nil(rk), "rk != nil");		set_free(rk);        set_free(pred->scontext[1]);		pred->scontext[1] = scontext;	}}/* MR11 - had enough of flags yet ? */int     MR_AmbSourceSearch=0;int     MR_AmbSourceSearchGroup=0;int     MR_AmbSourceSearchChoice=0;int     MR_AmbSourceSearchLimit=0;int     MR_matched_AmbAidRule=0;static    set         *matchSets[2]={NULL,NULL};static    int         *tokensInChain=NULL;static    Junction    *MR_AmbSourceSearchJ[2];void MR_traceAmbSourceKclient(){  int       i;  set       *save_fset;  int       save_ConstrainSearch;  set       incomplete;  Tree      *t;  if (matchSets[0] == NULL) {    matchSets[0]=(set *) calloc (CLL_k+1,sizeof(set));    require (matchSets[0] != NULL,"matchSets[0] alloc");    matchSets[1]=(set *) calloc (CLL_k+1,sizeof(set));    require (matchSets[1] != NULL,"matchSets[1] alloc");  };  for (i=1 ; i <= MR_AmbSourceSearchLimit ; i++) {    set_clr(matchSets[0][i]);    set_orel( (unsigned) tokensInChain[i],                              &matchSets[0][i]);    set_clr(matchSets[1][i]);    set_orel( (unsigned) tokensInChain[i],                              &matchSets[1][i]);  };  save_fset=fset;  save_ConstrainSearch=ConstrainSearch;  for (i=0 ; i < 2 ; i++) {#if 0**    fprintf(stdout,"  Choice:%d  Depth:%d  ",i+1,MR_AmbSourceSearchLimit);**    fprintf(stdout,"(");**    for (j=1 ; j <= MR_AmbSourceSearchLimit ; j++) {**      if (j != 1) fprintf(stdout," ");**      fprintf(stdout,"%s",TerminalString(tokensInChain[j]));**    };**    fprintf(stdout,")\n\n");#endif    fset=matchSets[i];    MR_AmbSourceSearch=1;    MR_MaintainBackTrace=1;    MR_AmbSourceSearchChoice=i;    ConstrainSearch=1;    maxk = MR_AmbSourceSearchLimit;    incomplete=empty;    t=NULL;    constrain = &(fset[1]);    MR_pointerStackReset(&MR_BackTraceStack);    TRAV(MR_AmbSourceSearchJ[i],maxk,&incomplete,t);    Tfree(t);    require (set_nil(incomplete),"MR_traceAmbSourceK TRAV incomplete");    require (MR_BackTraceStack.count == 0,"K: MR_BackTraceStack.count != 0");    set_free(incomplete);  };  ConstrainSearch=save_ConstrainSearch;  fset=save_fset;  MR_AmbSourceSearch=0;  MR_MaintainBackTrace=0;  MR_AmbSourceSearchChoice=0;}#ifdef __STDC__Tree *tTrunc(Tree *t,int depth)#elseTree *tTrunc(t,depth)  Tree  *t;#endif{    Tree    *u;    require ( ! (t == NULL && depth > 0),"tree too short");    if (depth == 0) return NULL;    if (t->token == ALT) {      u=tTrunc(t->down,depth);    } else {      u=tnode(t->token);      u->down=tTrunc(t->down,depth-1);    };    if (t->right != NULL) u->right=tTrunc(t->right,depth);    return u;}#ifdef __STDC__void MR_iterateOverTree(Tree *t,int chain[])#elsevoid MR_iterateOverTree(t,chain)  Tree          *t;  int           chain[];#endif{  if (t == NULL) return;  chain[0]=t->token;  if (t->down != NULL) {    MR_iterateOverTree(t->down,&chain[1]);  } else {    MR_traceAmbSourceKclient();  };  MR_iterateOverTree(t->right,&chain[0]);  chain[0]=0;}#ifdef __STDC__void MR_traceAmbSourceK(Tree *t,Junction *alt1,Junction *alt2)#elsevoid MR_traceAmbSourceK(t,alt1,alt2)  Tree      *t;  Junction  *alt1;  Junction  *alt2;#endif{    int         i;    int         depth;    int         maxDepth;    Tree        *truncatedTree;    if (MR_AmbAidRule == NULL) return;    if ( ! (            strcmp(MR_AmbAidRule,alt1->rname) == 0 ||            strcmp(MR_AmbAidRule,alt2->rname) == 0 ||            MR_AmbAidLine==alt1->line ||            MR_AmbAidLine==alt2->line           )       ) return;    MR_matched_AmbAidRule++;    /* there are no token sets in trees, only in TokNodes */    MR_AmbSourceSearchJ[0]=analysis_point( (Junction *) alt1->p1);    MR_AmbSourceSearchJ[1]=analysis_point( (Junction *) alt2->p1);    if (tokensInChain == NULL) {      tokensInChain=(int *) calloc (CLL_k+1,sizeof(int));      require (tokensInChain != NULL,"tokensInChain alloc");    };    MR_AmbSourceSearchGroup=0;    fprintf(stdout,"\n");    fprintf(stdout,"  Ambiguity Aid                 ");    fprintf(stdout,                (MR_AmbAidDepth <= LL_k ?                    "(-k %d  -aa %s  %s  -aad %d)\n\n" :                        "(-k %d  -aa %s  %s  [-k value limits -aad %d])\n\n"),                LL_k,                MR_AmbAidRule,                (MR_AmbAidMultiple ? "-aam" : ""),                MR_AmbAidDepth);    for (i=0 ; i < 2 ; i++) {      fprintf(stdout,"    Choice %d: %-25s  line %d  file %s\n",                  (i+1),                  MR_ruleNamePlusOffset( (Node *) MR_AmbSourceSearchJ[i]),                  MR_AmbSourceSearchJ[i]->line,                  FileStr[MR_AmbSourceSearchJ[i]->file]);    };    fprintf(stdout,"\n");    if (MR_AmbAidDepth < LL_k) {      maxDepth=MR_AmbAidDepth;    } else {      maxDepth=LL_k;    };    for (depth=1 ; depth <= maxDepth; depth++) {      MR_AmbSourceSearchLimit=depth;      if (depth < LL_k) {        truncatedTree=tTrunc(t,depth);        truncatedTree=tleft_factor(truncatedTree);        MR_iterateOverTree(truncatedTree,&tokensInChain[1]);    /* <===== */        Tfree(truncatedTree);      } else {        MR_iterateOverTree(t,tokensInChain);                /* <===== */      };      fflush(stdout);      fflush(stderr);    };    fprintf(stdout,"\n");    MR_AmbSourceSearch=0;    MR_MaintainBackTrace=0;    MR_AmbSourceSearchGroup=0;    MR_AmbSourceSearchChoice=0;    MR_AmbSourceSearchLimit=0;}/* this if for k=1 grammars only   this is approximate only because of the limitations of linear   approximation lookahead.  Don't want to do a k=3 search when   the user only specified a ck=3 grammar*/#ifdef __STDC__void MR_traceAmbSource(set *matchSets,Junction *alt1, Junction *alt2)#elsevoid MR_traceAmbSource(matchSets,alt1,alt2)  set       *matchSets;  Junction  *alt1;  Junction  *alt2;#endif{    set         *save_fset;    Junction    *p[2];    int         i;    int         j;    set         *dup_matchSets;    set         intersection;    set         incomplete;    set         tokensUsed;    int         depth;    if (MR_AmbAidRule == NULL) return;    if ( ! (            strcmp(MR_AmbAidRule,alt1->rname) == 0 ||            strcmp(MR_AmbAidRule,alt2->rname) == 0 ||            MR_AmbAidLine==alt1->line ||            MR_AmbAidLine==alt2->line           )       ) return;    MR_matched_AmbAidRule++;    save_fset=fset;    dup_matchSets=(set *) calloc(CLL_k+1,sizeof(set));    require (dup_matchSets != NULL,"Can't allocate dup_matchSets");    p[0]=analysis_point( (Junction *) alt1->p1);    p[1]=analysis_point( (Junction *) alt2->p1);    fprintf(stdout,"\n");    fprintf(stdout,"  Ambiguity Aid                 ");    fprintf(stdout,                (MR_AmbAidDepth <= CLL_k ?                    "(-ck %d  -aa %s  %s  -aad %d)\n\n" :                        "(-ck %d  -aa %s  %s  [-ck value limits -aad %d])\n\n"),                CLL_k,                MR_AmbAidRule,                (MR_AmbAidMultiple ? "-aam" : ""),                MR_AmbAidDepth);    for (i=0 ; i < 2 ; i++) {      fprintf(stdout,"    Choice %d: %-25s  line %d  file %s\n",                            (i+1),                            MR_ruleNamePlusOffset( (Node *) p[i]),                            p[i]->line,FileStr[p[i]->file]);    };    for (j=1; j <= CLL_k ; j++) {      fprintf(stdout,"\n    Intersection of lookahead[%d] sets:\n",j);      intersection=set_and(alt1->fset[j],alt2->fset[j]);      MR_dumpTokenSet(stdout,2,intersection);      set_free(intersection);    };    fprintf(stdout,"\n");    require (1 <= MR_AmbAidDepth && MR_AmbAidDepth <= CLL_k,                "illegal MR_AmbAidDepth");    MR_AmbSourceSearchGroup=0;    for (depth=1; depth <= MR_AmbAidDepth; depth++) {        MR_AmbSourceSearchLimit=depth;        for (i=0 ; i < 2 ; i++) {/***        fprintf(stdout,"  Choice:%d  Depth:%d\n\n",i+1,depth);  ***/            for (j=0 ; j <= CLL_k ; j++) { dup_matchSets[j]=set_dup(matchSets[j]); };            fset=dup_matchSets;            fflush(output);            fflush(stdout);            MR_AmbSourceSearch=1;            MR_MaintainBackTrace=1;            MR_AmbSourceSearchChoice=i;            maxk = depth;            tokensUsed=empty;            incomplete=empty;            constrain = &(fset[1]);            MR_pointerStackReset(&MR_BackTraceStack);            REACH(p[i],depth,&incomplete,tokensUsed);            fflush(output);            fflush(stdout);            require (set_nil(incomplete),"MR_traceAmbSource REACH incomplete");            require (MR_BackTraceStack.count == 0,"1: MR_BackTraceStack.count != 0");            set_free(incomplete);            set_free(tokensUsed);            for (j=0 ; j <= CLL_k ; j++) { set_free(dup_matchSets[j]); };        };    };    fprintf(stdout,"\n");    MR_AmbSourceSearch=0;    MR_MaintainBackTrace=0;    MR_AmbSourceSearchGroup=0;    MR_AmbSourceSearchChoice=0;    MR_AmbSourceSearchLimit=0;    fset=save_fset;    free ( (char *) dup_matchSets);}static int itemCount;void MR_backTraceDumpItemReset() {  itemCount=0;}#ifdef __STDC__void MR_backTraceDumpItem(FILE *f,int skip,Node *n)#elsevoid MR_backTraceDumpItem(f,skip,n)  FILE      *f;  int       skip;  Node      *n;#endif{  TokNode       *tn;  RuleRefNode   *rrn;  Junction      *j;  ActionNode    *a;  switch (n->ntype) {    case nToken:        itemCount++; if (skip) goto EXIT;        tn=(TokNode *)n;        if (set_nil(tn->tset)) {          fprintf(f,"  %2d #token %-23s",itemCount,TerminalString(tn->token));        } else {          fprintf(f,"  %2d #tokclass %-20s",itemCount,TerminalString(tn->token));        };        break;    case nRuleRef:        itemCount++; if (skip) goto EXIT;        rrn=(RuleRefNode *)n;        fprintf(f,"  %2d to %-27s",itemCount,rrn->text);        break;    case nAction:        a=(ActionNode *)n;        goto EXIT;    case nJunction:      j=(Junction *)n;      switch (j->jtype) {        case aSubBlk:            if (j->guess) {              itemCount++; if (skip) goto EXIT;              fprintf(f,"  %2d %-30s",itemCount,"in (...)? block at");              break;            };/******     fprintf(f,"  %2d %-32s",itemCount,"in (...) block at");  *******//******     break;                                                          *******/            goto EXIT;        case aOptBlk:            itemCount++; if (skip) goto EXIT;            fprintf(f,"  %2d %-30s",itemCount,"in {...} block");            break;        case aLoopBlk:            itemCount++; if (skip) goto EXIT;            fprintf(f,"  %2d %-30s",itemCount,"in (...)* block");            break;        case EndBlk:            if (j->alpha_beta_guess_end) {              itemCount++; if (skip) goto EXIT;              fprintf(f,"  %2d %-30s",itemCount,"end (...)? block at");              break;            };            goto EXIT;/******     fprintf(f,"  %2d %-32s",itemCount,"end of a block at");     *****//******     break;                                                             *****/        case RuleBlk:            itemCount++; if (skip) goto EXIT;            fprintf(f,"  %2d %-30s",itemCount,j->rname);            break;        case Generic:            goto EXIT;        case EndRule:            itemCount++; if (skip) goto EXIT;            fprintf (f,"  %2d end %-26s",itemCount,j->rname);            break;        case aPlusBlk:            itemCount++; if (skip) goto EXIT;            fprintf(f,"  %2d %-30s",itemCount,"in (...)+ block");            break;        case aLoopBegin:            goto EXIT;      };      break;  };  fprintf(f," %-23s line %-4d  %s\n",MR_ruleNamePlusOffset(n),n->line,FileStr[n->file]);EXIT:  return;}static PointerStack     previousBackTrace={0,0,NULL};#ifdef __STDC__void MR_backTraceReport()#elsevoid MR_backTraceReport()#endif{  int       i;  int       match;  int       limitMatch;  Node      *p;  TokNode   *tn;  set       remainder;  int       depth;  /* Even when doing a k=2 search this routine can get       called when there is only 1 token on the stack.     This is because something like rRuleRef can change       the search value of k from 2 to 1 temporarily.     It does this because the it wants to know the k=1       first set before it does a k=2 search  */  depth=0;  for (i=0; i < MR_BackTraceStack.count ; i++) {    p=(Node *) MR_BackTraceStack.data[i];    if (p->ntype == nToken) depth++;  };/* MR14 */  if (MR_AmbSourceSearch) {/* MR14 */     require (depth <= MR_AmbSourceSearchLimit,"depth > MR_AmbSourceSearchLimit");/* MR14 */  }  if (depth < MR_AmbSourceSearchLimit) {    return;  };  MR_backTraceDumpItemReset();  limitMatch=MR_BackTraceStack.count;  if (limitMatch > previousBackTrace.count) {    limitMatch=previousBackTrace.count;  };  for (match=0; match < limitMatch; match++) {    if (MR_BackTraceStack.data[match] !=        previousBackTrace.data[match]) {      break;    };  };  /* not sure at the moment why there would be duplicates */  if (match != MR_BackTraceStack.count) {    fprintf(stdout,"     Choice:%d  Depth:%d  Group:%d",        (MR_AmbSourceSearchChoice+1),        MR_AmbSourceSearchLimit,        ++MR_AmbSourceSearchGroup);    depth=0;    fprintf(stdout,"  (");    for (i=0; i < MR_BackTraceStack.count ; i++) {      p=(Node *) MR_BackTraceStack.data[i];      if (p->ntype != nToken) continue;      tn=(TokNode *)p;      if (depth != 0) fprintf(stdout," ");      fprintf(stdout,TerminalString(tn->token));      depth++;      if (! MR_AmbAidMultiple) {        if (set_nil(tn->tset)) {          set_rm( (unsigned) tn->token,fset[depth]);        } else {          remainder=set_dif(fset[depth],tn->tset);          set_free(fset[depth]);          fset[depth]=remainder;        };      };    };    fprintf(stdout,")\n");    for (i=0; i < MR_BackTraceStack.count ; i++) {      MR_backTraceDumpItem(stdout, (i<match) ,(Node *) MR_BackTraceStack.data[i]);    };    fprintf(stdout,"\n");    fflush(stdout);    MR_pointerStackReset(&previousBackTrace);    for (i=0; i < MR_BackTraceStack.count ; i++) {      MR_pointerStackPush(&previousBackTrace,MR_BackTraceStack.data[i]);    };  };}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -