sntncepars.cpp
上传用户:tenhai
上传日期:2021-02-19
资源大小:492k
文件大小:18k
源码类别:

组合框控件

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "symbol.h"
  3. #include "rrtbl.h"
  4. #include "grmrgrph.h"
  5. #include "sntncelex.h"
  6. #include "sntncepars.h"
  7. #include "math.h"
  8. #define pfat(cate, from) catetbl[from*tntcount+cate]
  9. //#define DELTA 1e-10
  10. #define MAXSORTSTACK 50
  11. char *mymark;
  12. extern FILE *pfo;
  13. FILE *pfedgs;
  14. int interactive;
  15. chartnode_t chart[MAXCNODE];
  16. //unsigned int glbmaxsub=0;
  17. typedef struct range_t{
  18. int l;
  19. int r;
  20. }range_t;
  21. range_t rangestack[MAXSORTSTACK];
  22. rrset_struct *rrset=NULL;
  23. typedef struct rrrqentry_t{
  24.         edge_t ed;
  25.         unsigned int cate;
  26. int nxt;
  27. }rrqentry_t;
  28. typedef struct rrq_t{
  29.         rrqentry_t queue[MAXSQUE];
  30. int topptr;
  31. int botptr;
  32. }rrq_t;
  33. unsigned int *lstack;
  34. int lsptr;
  35. rrq_t rq;
  36. pf_t *pfroot=NULL, *pfhead=NULL;
  37. pf_t **catetbl;
  38. edge_t *edgepool;
  39. pf_t *trnodepool;
  40. int curavle=0;
  41. int loope=0;
  42. int npfs;
  43. pf_t *tokenpf;
  44. int cirflag;
  45. edge_t *pooledg;
  46. rrqentry_t *nre;
  47. int unacc[MAXCNODE];
  48. pf_t *addpf(unsigned int cate, int from){
  49.   int index;
  50.   pf_t *ppf;
  51.   index=from*tntcount+cate;
  52.   if ((ppf=catetbl[index])==NULL){
  53.      ppf=&trnodepool[npfs++];
  54.      //ppf=(pf_t *)malloc(sizeof(pf_t));
  55.      ppf->cate=cate;
  56.  ppf->litoramb.literal=NULL;
  57.      ppf->subpfs=NULL;
  58.   //   ppf->nxt=pfhead;
  59.  ppf->prb=0;
  60. //  ppf->refs=0;
  61.      pfhead=ppf;
  62.      catetbl[index]=ppf;
  63.   }
  64.   return ppf;
  65. }
  66. int sumsubpf(pf_t *pf, edge_t *compedge){
  67. double subprb=1.0;
  68. int solid=0;
  69. unsigned int cursub, pos, rlen;
  70. edge_t *pe;
  71. if (compedge->rule<=rulcount){
  72. rlen=rightlenof(compedge->rule);
  73. for (pe=compedge->prevedge; (pe!=NULL) ;pe=pe->prevedge)
  74. subprb*=pe->ppf->prb;
  75. subprb*=probof(compedge->rule);
  76. if (compedge->ppf->prb>0){
  77. subprb*=compedge->ppf->prb;
  78. solid=1;
  79. }
  80. if (-pf->prb<=subprb){
  81. if (pf->subpfs){
  82. if (!solid)
  83. if (((pf->litoramb.totalamb+1)%MAXAMB)==0){
  84. pf->subpfs=(subpf_t *)realloc(pf->subpfs, 
  85. (pf->litoramb.totalamb+1+MAXAMB)*sizeof(subpf_t));
  86. }
  87. }
  88. else{
  89. pf->subpfs=(subpf_t *)calloc(MAXAMB, sizeof(subpf_t));
  90. pf->subpfs[0].sublst=NULL;
  91. }
  92. if (solid){
  93. cursub=0;
  94. pf->subpfs[cursub].rulno=compedge->rule;
  95. if (!pf->subpfs[0].sublst){
  96. pf->subpfs[cursub].sublst=
  97. (pf_t **)calloc(MAXRLEN, sizeof(pf_t *));
  98. }
  99. }
  100. else{
  101. cursub=++pf->litoramb.totalamb;
  102. pf->subpfs[cursub].rulno=compedge->rule;
  103. pf->subpfs[cursub].sublst=
  104. (pf_t **)calloc(rlen, sizeof(pf_t *));
  105. }
  106. for (pos=rlen-1,pe=compedge;pe!=NULL;pos--,pe=pe->prevedge){
  107. pf->subpfs[cursub].sublst[pos]=pe->ppf;
  108. }
  109. if (!solid)
  110. subprb*=-compedge->ppf->prb;
  111. if (-pf->prb<subprb){
  112. pf->prb=-subprb;
  113. }
  114. }
  115. }
  116. else{
  117. pf->litoramb.literal=currwentry->word;
  118. pf->prb=1.0;
  119. }
  120. return 0;
  121. }
  122. releasepf(pf_t *ppf){
  123.   unsigned int c;
  124.   if (ppf->subpfs){
  125. for (c=0;c<=ppf->litoramb.totalamb;c++)
  126. if (ppf->subpfs[c].sublst)
  127. free(ppf->subpfs[c].sublst);
  128. free(ppf->subpfs);
  129.   }
  130.   //free(ppf);
  131.   return 0;
  132. }
  133. releasewholepf(){
  134. int i;
  135. for (i=0; i<npfs; i++){
  136. releasepf(&trnodepool[i]);
  137. }
  138. /*
  139. int nonz=0;
  140.   pf_t *ppf, *qpf; 
  141.   
  142.     for (qpf=ppf=pfhead;ppf!=NULL;){
  143.            if (ppf==pfhead){
  144.               pfhead=qpf=ppf->nxt;
  145.   if (ppf->refs==0)
  146.   nonz++;
  147.               releasepf(ppf);
  148.               ppf=pfhead;
  149.            }
  150.            else{
  151.               qpf->nxt=ppf->nxt;
  152.   if (ppf->refs==0)
  153.   nonz++;
  154.               releasepf(ppf);
  155.               ppf=qpf->nxt;
  156.            }
  157.          //  npfs--;
  158.     }
  159. pfhead=NULL;
  160. printf("n%fn", (double)nonz/(double)npfs);
  161. */
  162. npfs=0;
  163. return 0;
  164. }
  165. addchartnode(){
  166.    int i;
  167. unsigned int j;
  168.    
  169.    for (i=0; i<MAXCNODE; i++){
  170.    chart[i].numb=0;
  171.    chart[i].pled=-1;
  172.    chart[i].plst=-1;
  173.    chart[i].chd=-1;
  174.    chart[i].ctl=-1;
  175.    chart[i].expeclist=(char *)malloc(sizeof(char)*tntcount);
  176.    for (j=0; j<tntcount; j++){
  177.    chart[i].expeclist[j]=0;
  178.    }
  179.    }
  180.    return 0;
  181. }
  182. quicksrt(int l, int r){
  183. int i,j;
  184. edge_t ed;
  185. int rstptr;
  186. rangestack[rstptr=0].l=l;
  187. rangestack[rstptr].r=r;
  188. while (rstptr>=0){
  189. l=rangestack[rstptr].l;
  190. r=rangestack[rstptr].r;
  191. rstptr--;
  192. st:
  193. if (l>=r)
  194. continue;
  195. i=l;j=r;
  196. ed=edgepool[i];
  197. while (!(i==j)){
  198. while ((j>i) && ( EXP(edgepool[j].rule, edgepool[j].role)>EXP(ed.rule, ed.role)))
  199. j--;
  200. if (i<j)
  201. edgepool[i++]=edgepool[j];
  202. while ((j>i) && ( EXP(edgepool[i].rule, edgepool[i].role)<EXP(ed.rule, ed.role)))
  203. i++;
  204. if (i<j)
  205. edgepool[j--]=edgepool[i];
  206. }
  207. edgepool[i]=ed;
  208. i++;j--;
  209. if ((r-i)>(j-l)){
  210. rstptr++;
  211. rangestack[rstptr].l=i; 
  212. rangestack[rstptr].r=r;
  213. r=j;
  214. goto st;
  215. }
  216. else{
  217. rstptr++;
  218. rangestack[rstptr].l=l;
  219. rangestack[rstptr].r=j;
  220. l=i;
  221. goto st;
  222. }
  223. }
  224. return 0;
  225. }
  226. qsrt(int l, int r){
  227. int qi,qj;
  228. edge_t ed;
  229. edge_t *edg;
  230. int flagO, flagL;
  231. int rstptr;
  232. rangestack[rstptr=0].l=l;
  233. rangestack[rstptr].r=r;
  234. while (rstptr>=0){
  235. l=rangestack[rstptr].l;
  236. r=rangestack[rstptr].r;
  237. rstptr--;
  238. start:
  239. if (l>=r)
  240. continue;
  241. qi=l;qj=r;
  242. ed=edgepool[qi];
  243. while (!(qi==qj)){
  244. edg=&edgepool[qj];
  245. while ( (qj>qi) &&
  246. ( ((flagO=edg->origin-ed.origin)>0) ||
  247. ( !flagO && 
  248. ( ((flagL=leftof(edg->rule)-leftof(ed.rule))>0) ||
  249. ( !flagL && 
  250. (PST(edg->rule, edg->role)>PST(ed.rule, ed.role))
  251. // RGT(edg->rule, edg->role, ed.rule, ed.role)
  252. )
  253. )
  254. )
  255. )
  256. )
  257. edg=&edgepool[--qj];
  258. if (qi<qj)
  259. edgepool[qi++]=edgepool[qj];
  260. edg=&edgepool[qi];
  261. while ( (qj>qi) &&
  262. ( ((flagO=ed.origin-edg->origin)>0) ||
  263. ( !flagO && 
  264. ( ((flagL=leftof(ed.rule)-leftof(edg->rule))>0) ||
  265. ( !flagL && 
  266. (PST(ed.rule, ed.role)>PST(edg->rule, edg->role))
  267. // RGT(ed.rule, ed.role, edg->rule, edg->role)
  268. )
  269. )
  270. )
  271. )
  272. )
  273. edg=&edgepool[++qi];
  274. if (qi<qj)
  275. edgepool[qj--]=edgepool[qi];
  276. }
  277. edgepool[qi]=ed;
  278. qi++;qj--;
  279. if ((r-qi)>(qj-l)){
  280. rstptr++;
  281. rangestack[rstptr].l=qi; 
  282. rangestack[rstptr].r=r;
  283. r=qj;
  284. goto start;
  285. }
  286. else{
  287. rstptr++;
  288. rangestack[rstptr].l=l;
  289. rangestack[rstptr].r=qj;
  290. l=qi;
  291. goto start;
  292. }
  293. }
  294.  
  295.   return 0;
  296. }
  297. releasechart(){
  298.   int p;
  299.   for (p=0;p<MAXCNODE;p++){
  300.   chart[p].pled=chart[p].plst=-1;
  301.   chart[p].chd=chart[p].ctl=-1;
  302.   free(chart[p].expeclist);
  303.   chart[p].expeclist=NULL;
  304.   }
  305.   return 0;
  306. }
  307. releaseedges(){
  308.   int p;
  309.   unsigned int q;
  310.   for (p=0;(chart[p].numb!=0); p++){
  311.   chart[p].numb=0;
  312.   for (q=0; q<tntcount; q++){
  313.   chart[p].expeclist[q]=0;
  314.   }
  315.   }
  316. }
  317. searchcompe(unsigned int cate, int *pos){
  318.   int bottom, middle, top;
  319.   bottom=chart[accchartnode].plst+1;
  320.   top=chart[accchartnode].pled;
  321.   if (top<bottom){
  322.   *pos=top;
  323.   return 0;
  324.   }
  325.   while (top>bottom){
  326.     middle=(top+bottom)/2;
  327.     if (cate>EXP(edgepool[middle].rule, edgepool[middle].role))
  328.        bottom=middle+1;
  329.     else
  330.        top=middle;
  331.   }
  332.  /*
  333.   if (top==bottom){
  334.      if (cate>EXP(edgepool[top].rule, edgepool[top].role))
  335.         bottom++;
  336.   } 
  337.   *pos=bottom;
  338.   */
  339.   *pos=top;
  340.   if ( 
  341.      !(cate==EXP(edgepool[*pos].rule, edgepool[*pos].role)))
  342.      return 0;
  343.   else
  344.      return 1;
  345. }
  346. #define addexpec(expec){
  347. chart[curchartnode].expeclist[expec]=1;
  348. }
  349. #define addedge(dumrule, dumrole, dumorigin, dumprevedge, dumppf){
  350. pooledg=&edgepool[curavle++];
  351. pooledg->rule=dumrule;
  352. pooledg->role=dumrole;
  353. pooledg->origin=dumorigin;
  354. pooledg->prevedge=dumprevedge;
  355. pooledg->ppf=dumppf;
  356. if (dumrole==0)
  357. loope++;
  358. chart[curchartnode].numb++;
  359. chart[curchartnode].pled++;
  360. }
  361. #define enqedge(dumrule, dumrole, dumorigin, dumprevedge, dumppf, dumcate){
  362. nre=&rq.queue[++rq.topptr];
  363. nre->nxt=-1;
  364. nre->cate=dumcate;
  365. nre->ed.rule=dumrule;
  366. nre->ed.role=dumrole;
  367. nre->ed.origin=dumorigin;
  368. nre->ed.prevedge=dumprevedge;
  369. nre->ed.ppf=dumppf;
  370. (chart[dumorigin].chd==-1)?(chart[dumorigin].chd=rq.topptr):
  371. (rq.queue[chart[dumorigin].ctl].nxt=rq.topptr);
  372. chart[dumorigin].ctl=rq.topptr;
  373. }
  374. #define rqinit {rq.topptr=rq.botptr=-1;}
  375. #define lsempty (lsptr==-1)
  376. #define lsinit lsptr=-1;
  377. #define lspush(catee) lstack[++lsptr]=catee;
  378. #define lspop(pcate) pcate=lstack[lsptr--];
  379. double prbbranch(pf_t *ppf){
  380.   subpf_t subpf;
  381.   int sublen, curpos;
  382.   unsigned int amb, vp=0;
  383.   double subprb, maxprb;
  384.   
  385.   if (ppf->subpfs==NULL){
  386.   ppf->prb=1.0;
  387.       return 1.0;
  388.   }
  389.   maxprb=-1.0;
  390.   ppf->prb=0;
  391.   for (amb=0; amb<=ppf->litoramb.totalamb; amb++){
  392.       subprb=1.0;
  393.       subpf=ppf->subpfs[amb];
  394.   if (subpf.sublst==NULL)
  395.   continue;
  396.       sublen=rightlenof(subpf.rulno);
  397.       for (curpos=0;curpos<sublen;curpos++){
  398.   double x=subpf.sublst[curpos]->prb;
  399.   if ((x==0)&&(tokenpf)){
  400.   cirflag=1;
  401.   subprb=0;
  402.   continue;
  403.   }
  404.      if ((sublen==1)&&(x<0)&&(!tokenpf))
  405. tokenpf=ppf;
  406.           subprb*=(x>=0)?x:prbbranch(subpf.sublst[curpos]);
  407.   if (ppf==tokenpf){
  408.      tokenpf=NULL;
  409. cirflag=0;
  410.   }
  411.       }
  412.   subprb*=probof(subpf.rulno);
  413.       if (subprb>=maxprb){
  414.   maxprb=subprb;
  415.   vp=amb;
  416.   }
  417.   }
  418.   if (!cirflag){
  419. ppf->prb=maxprb;
  420. for (amb=0; amb<=ppf->litoramb.totalamb; amb++){
  421.   if (amb==vp)
  422.   continue;
  423. if (ppf->subpfs[amb].sublst){
  424. free(ppf->subpfs[amb].sublst);
  425. ppf->subpfs[amb].sublst=NULL;
  426. }
  427. }
  428. subpf=ppf->subpfs[vp];
  429. free(ppf->subpfs);
  430. ppf->subpfs=(subpf_t *)malloc(sizeof(subpf_t));
  431. ppf->subpfs[0]=subpf;
  432. ppf->litoramb.totalamb=0;
  433. return ppf->prb;
  434.   }
  435.   else{
  436.   ppf->prb=-1.0;
  437.   return maxprb;
  438.   }
  439. }
  440. prbmaxprefix(){
  441. int bottom, top, curbot, curtop, curedp;
  442. double curmaxprb, curprb;
  443. edge_t *pe, *ptop, *pcur;
  444. double x;
  445. bottom=chart[curchartnode].plst+1;
  446. top=chart[curchartnode].pled;
  447. for (curtop=curbot=bottom; curtop<=top;){
  448. curmaxprb=-1;
  449. curedp=curtop;
  450. do{
  451. for (x=1.0, pe=&edgepool[curtop]; pe!=NULL; pe=pe->prevedge)
  452. x*=pe->ppf->prb;
  453. curprb=x*=probof(edgepool[curtop].rule);
  454. if (curprb>curmaxprb){
  455. /*
  456. if (curedp!=curtop)
  457. if (edgepool[curedp].ppf)
  458. edgepool[curedp].ppf->refs--;
  459. */
  460. curedp=curtop;
  461. curmaxprb=curprb;
  462. }
  463. /*
  464. else
  465. if (edgepool[curedp].ppf)
  466. edgepool[curtop].ppf->refs--;
  467. */
  468. curtop++;
  469. }while ((curtop<=top)&&
  470. ((ptop=&edgepool[curtop])->origin==(pcur=&edgepool[curedp])->origin)&&
  471. (leftof(ptop->rule)==leftof(pcur->rule))&&
  472. (PST(ptop->rule, ptop->role)==PST(pcur->rule, pcur->role))
  473. //REQ(ptop->rule, ptop->role, pcur->rule, pcur->role)
  474. );
  475. edgepool[curbot++]=edgepool[curedp];
  476. }
  477. chart[curchartnode].pled=curbot-1;
  478. curavle=curbot;
  479. bottom=chart[curchartnode].plst+1;
  480. top=chart[curchartnode].pled;
  481. return 0;
  482. }
  483. pred(){
  484. int match=0;
  485. unsigned int cate, expecate;
  486. rulrol_struct  *qrr;
  487. int loc, prerr;
  488. int ptr,lastptr;
  489. unsigned int rul;
  490. unsigned int rol;
  491. int i;
  492. if ((*nextdefs)[0]==0)
  493. return 0;
  494. while (!lsempty){
  495. lspop(cate);
  496. if ((cate<tcount)){
  497. if (!match)
  498.         for (i=0; (*nextdefs)[i]<tcount; i++){
  499. if (cate==(*nextdefs)[i]){
  500. match=1;
  501. break;
  502. }
  503. }
  504. }
  505. else{
  506. prerr=0;
  507. //merge rrlist
  508. for (i=0; (*nextdefs)[i]<tcount; i++){
  509. for (qrr=lrr(cate, (*nextdefs)[i]); qrr!=NULL; qrr=qrr->nxt){
  510. loc=ROLPOS(qrr->rule, qrr->role);
  511. if (!rrset[loc].prr){
  512. rrset[loc].prr=qrr;
  513. rrset[prerr].next=loc;
  514. prerr=loc;
  515. }
  516. }
  517. }
  518. lastptr=0;
  519. if ((ptr=rrset[0].next)!=-1)
  520. match=1;
  521. for (;ptr!=-1;ptr=rrset[ptr].next){
  522. rul=rrset[ptr].prr->rule;
  523. rol=rrset[ptr].prr->role;
  524. // addedge(rul, rol, curchartnode, NULL, NULL);
  525. expecate=EXP(rul, rol);
  526. addexpec(expecate);
  527. addexpec(leftof(rul));
  528. if (expecate>=tcount && !mymark[expecate]){
  529. lspush(expecate);
  530. mymark[expecate]=1;
  531. }
  532. rrset[ptr].prr=NULL;
  533. rrset[lastptr].next=-1;
  534. lastptr=ptr;
  535. }
  536. }
  537. }
  538. lsinit;
  539. return match;
  540. }
  541. init(){
  542. extern int bufptr;
  543. unsigned int nidx;
  544. for (nidx=0;nidx<tntcount;nidx++)
  545. mymark[nidx]=0;
  546. bufptr=0;
  547. lsinit;
  548. rqinit;
  549. curavle=0;
  550. loope=0;
  551. curchartnode=prechartnode=0;
  552. filllattice();
  553. lookahead();
  554. chart[curchartnode].plst=chart[curchartnode].pled=-1;
  555. chart[curchartnode].chd=chart[curchartnode].ctl=-1;
  556. // addedge(0, 0, 0, NULL, NULL);
  557. lspush(ssym->sid);
  558. chart[0].expeclist[ssym->sid]=1;
  559. catetbl[ssym->sid]=NULL;
  560. }
  561. scan(){
  562. int catedim, i;
  563. /*choose the most probable prefix parse*/
  564. if (curchartnode>=1){
  565. qsrt(chart[prechartnode].plst+1, chart[prechartnode].pled);
  566. prbmaxprefix();
  567. }
  568. quicksrt(chart[prechartnode].plst+1, chart[prechartnode].pled);
  569. /*step forward*/
  570. currwentry=nextwentry;
  571. currdefs=nextdefs;
  572. accchartnode=prechartnode=curchartnode++;
  573. lookahead();
  574. chart[curchartnode].plst=chart[curchartnode].pled=curavle-1;
  575. for (i=0; (*currdefs)[i]<tcount; i++)
  576. enqedge(rulupbound, 0, prechartnode, NULL, NULL, (*currdefs)[i]);
  577. catedim=curchartnode*tntcount;
  578. for (i=0;i<catedim;i++)
  579. catetbl[i]=NULL;
  580. return 0;
  581. }
  582. comp(){
  583. edge_t *compedge, *prevedge;
  584. rulrol_struct  *qrr;
  585. pf_t *newpf;
  586. unsigned int cate, expecate;
  587. int epos=0;
  588. unsigned int rul;
  589. unsigned int rol;
  590. int ptr, lastptr, lastiniptr;
  591. int loc, prerr;
  592. int i;
  593. unsigned int nidx;
  594. int hd;
  595. int curcatedim;
  596. int eend;
  597. /*initialize the marks for prediction*/
  598. for (nidx=0;nidx<tntcount;nidx++)
  599. mymark[nidx]=0;
  600. while ((accchartnode>0) || (chart[0].chd>=0)){
  601. hd=chart[accchartnode].chd;
  602. /*dequeue at accchartnode*/
  603. cate=rq.queue[hd].cate;
  604. compedge=&(rq.queue[hd].ed);
  605. hd=chart[accchartnode].chd=rq.queue[hd].nxt;
  606. if (hd==-1)
  607. chart[accchartnode].ctl=-1;
  608. eend=chart[accchartnode].pled;
  609. if ((newpf=pfat(cate, accchartnode))!=NULL){
  610. /*add ambiguity*/
  611. sumsubpf(newpf, compedge);
  612. }
  613. else{
  614. /*fill in the qualified-roles-list*/
  615. loc=prerr=0;
  616. for (i=0; (*nextdefs)[i]<tcount; i++){
  617. for (qrr=rrr(cate, (*nextdefs)[i]);qrr!=NULL;qrr=qrr->nxt){
  618. loc=ROLPOS(qrr->rule, qrr->role);
  619. if (rrset[loc].prr==NULL){
  620. rrset[loc].prr=qrr;
  621. rrset[prerr].next=loc;
  622. prerr=loc;
  623. }
  624. }
  625. }
  626. /*examine the expected roles*/
  627. //epos=chart[accchartnode].plst+1;
  628. if (searchcompe(cate, &epos))
  629. do{
  630. prevedge=&edgepool[epos];
  631. rul=prevedge->rule;
  632. rol=(unsigned int)(prevedge->role+1);
  633. loc=ROLPOS(rul, rol);
  634. if (rrset[loc].prr){
  635. /*if this role is expected and qualified, add it*/
  636. /*new node can be added in the forest. only executed at the first time*/
  637. if (!newpf)
  638. sumsubpf(newpf=addpf(cate, accchartnode), compedge);
  639. // newpf->refs++;
  640. if (rul>0){
  641. expecate=EXP(rul, rol);
  642. if (TOSHIFT(rul, rol)){
  643. /*rightmost not met yet, put into edgepool*/
  644. addedge(rul, rol, prevedge->origin, prevedge, newpf);
  645. if (!mymark[expecate]){
  646. /*mark the expected cates, for prediction*/
  647. lspush(expecate);
  648. mymark[expecate]=1;
  649. }
  650. }
  651. else
  652. /*rightmost of rhs met, enque for completion*/
  653. enqedge(rul, rol, prevedge->origin, prevedge, newpf, expecate);
  654. }
  655. }
  656. // epos++;
  657. }while ((++epos<=eend) 
  658. && (EXP(edgepool[epos].rule, edgepool[epos].role)==cate));
  659. /*clear the qulified-roles-list*/
  660. lastptr=lastiniptr=0;
  661. for (ptr=rrset[0].next;ptr!=-1;ptr=rrset[ptr].next){
  662. rrset[lastptr].next=-1;
  663. lastptr=ptr;
  664. if (rrset[ptr].prr->role>1){
  665. rrset[ptr].prr=NULL;
  666. }
  667. else{
  668. rrset[lastiniptr].next=ptr;
  669. lastiniptr=ptr;
  670. }
  671. }
  672. //examine x.1 roles
  673. if (chart[accchartnode].expeclist[cate]){
  674. lastptr=0;
  675. for (ptr=rrset[0].next; ptr!=-1; ptr=rrset[ptr].next){
  676. rul=rrset[ptr].prr->rule;
  677. rol=rrset[ptr].prr->role;
  678. if ((rul==0)||(chart[accchartnode].expeclist[leftof(rul)])){
  679. if (!newpf)
  680. sumsubpf(newpf=addpf(cate, accchartnode), compedge);
  681. if (rul>0){
  682. expecate=EXP(rul, rol);
  683. if (TOSHIFT(rul, rol)){
  684. //rightmost not met yet, put into edgepool
  685. addedge(rul, rol, accchartnode, NULL, newpf);
  686. if (!mymark[expecate]){
  687. //mark the expected cates, for prediction
  688. lspush(expecate);
  689. mymark[expecate]=1;
  690. }
  691. }
  692. else
  693. //rightmost of rhs met, enque for completion
  694. enqedge(rul, rol, accchartnode, NULL, newpf, expecate);
  695. }
  696. }
  697. }
  698. }
  699. /*clear the qulified-roles-list*/
  700. lastptr=0;
  701. for (ptr=rrset[0].next;ptr!=-1;ptr=rrset[ptr].next){
  702. rrset[ptr].prr=NULL;
  703. rrset[lastptr].next=-1;
  704. lastptr=ptr;
  705. }
  706. }
  707. /*spread from right to left*/
  708. if (chart[accchartnode].chd<0){
  709. curcatedim=(accchartnode+1)*tntcount;
  710. for (i=accchartnode*tntcount; i<curcatedim; i++){
  711. if (catetbl[i])
  712. if (catetbl[i]->prb<0)
  713. prbbranch(catetbl[i]);
  714. }
  715. while ((accchartnode>0)&&(chart[accchartnode].chd<0))
  716. accchartnode--;
  717. }
  718. }
  719. rqinit;
  720. }
  721. parses(){
  722.   init();
  723.   for (;!endofsntnce;prechartnode=curchartnode){
  724. //   printf("parsing at %dn", curchartnode);
  725.       if (!pred()){
  726.          endofsntnce=0;
  727.          releaseedges();
  728.  curavle=0;
  729.  pfroot=NULL;
  730.  nextwentry=NULL;
  731.          return -1;
  732.       }
  733.       scan();
  734. //   if (nextwentry==NULL)
  735. //   break;
  736.       comp();
  737.   }
  738.   pfroot=catetbl[ssym->sid];
  739.   endofsntnce=0;
  740.   releaseedges();
  741.   fprintf(pfedgs, "%dt%dt%dt%dn", curavle, loope, npfs, endposofsntnce);
  742.   curavle=0;
  743.   loope=0;
  744.   return 0;
  745. }