Lines Matching refs:lemp

604 void FindFirstSets(lemp)  in FindFirstSets()  argument
605 struct lemon *lemp; in FindFirstSets()
611 for(i=0; i<lemp->nsymbol; i++){
612 lemp->symbols[i]->lambda = B_FALSE;
614 for(i=lemp->nterminal; i<lemp->nsymbol; i++){
615 lemp->symbols[i]->firstset = SetNew();
621 for(rp=lemp->rule; rp; rp=rp->next){
637 for(rp=lemp->rule; rp; rp=rp->next){
661 void FindStates(lemp) in FindStates() argument
662 struct lemon *lemp; in FindStates()
670 if( lemp->start ){
671 sp = Symbol_find(lemp->start);
673 ErrorMsg(lemp->filename,0,
676 symbol instead.",lemp->start,lemp->rule->lhs->name);
677 lemp->errorcnt++;
678 sp = lemp->rule->lhs;
681 sp = lemp->rule->lhs;
687 for(rp=lemp->rule; rp; rp=rp->next){
691 ErrorMsg(lemp->filename,0,
695 lemp->errorcnt++;
712 (void)getstate(lemp);
720 PRIVATE struct state *getstate(lemp) in getstate() argument
721 struct lemon *lemp; in getstate()
747 Configlist_closure(lemp); /* Compute the configuration closure */
754 stp->index = lemp->nstate++; /* Every state gets a sequence number */
757 buildshifts(lemp,stp); /* Recursively compute successor states */
765 PRIVATE void buildshifts(lemp,stp) in buildshifts() argument
766 struct lemon *lemp; in buildshifts()
802 newstp = getstate(lemp);
813 void FindLinks(lemp) in FindLinks() argument
814 struct lemon *lemp; in FindLinks()
824 for(i=0; i<lemp->nstate; i++){
825 stp = lemp->sorted[i];
833 for(i=0; i<lemp->nstate; i++){
834 stp = lemp->sorted[i];
849 void FindFollowSets(lemp) in FindFollowSets() argument
850 struct lemon *lemp; in FindFollowSets()
858 for(i=0; i<lemp->nstate; i++){
859 for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){
866 for(i=0; i<lemp->nstate; i++){
867 for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){
886 void FindActions(lemp) in FindActions() argument
887 struct lemon *lemp; in FindActions()
899 for(i=0; i<lemp->nstate; i++){ /* Loop over all states */
900 stp = lemp->sorted[i];
903 for(j=0; j<lemp->nterminal; j++){
907 Action_add(&stp->ap,REDUCE,lemp->symbols[j],(char *)cfp->rp);
915 if( lemp->start ){
916 sp = Symbol_find(lemp->start);
917 if( sp==0 ) sp = lemp->rule->lhs;
919 sp = lemp->rule->lhs;
924 Action_add(&lemp->sorted[0]->ap,ACCEPT,sp,0);
927 for(i=0; i<lemp->nstate; i++){
930 stp = lemp->sorted[i];
937 lemp->nconflict += resolve_conflict(ap,nap,lemp->errsym);
943 for(rp=lemp->rule; rp; rp=rp->next) rp->canReduce = B_FALSE;
944 for(i=0; i<lemp->nstate; i++){
946 for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){
950 for(rp=lemp->rule; rp; rp=rp->next){
952 ErrorMsg(lemp->filename,rp->ruleline,"This rule can not be reduced.\n");
953 lemp->errorcnt++;
1142 void Configlist_closure(lemp) in Configlist_closure() argument
1143 struct lemon *lemp; in Configlist_closure()
1157 if( sp->rule==0 && sp!=lemp->errsym ){
1158 ErrorMsg(lemp->filename,rp->line,"Nonterminal \"%s\" has no rules.",
1160 lemp->errorcnt++;
2493 PRIVATE char *file_makename(lemp,suffix) in file_makename() argument
2494 struct lemon *lemp; in file_makename()
2500 name = malloc( strlen(lemp->filename) + strlen(suffix) + 5 );
2505 strcpy(name,lemp->filename);
2515 PRIVATE FILE *file_open(lemp,suffix,mode) in file_open() argument
2516 struct lemon *lemp; in file_open()
2522 if( lemp->outname ) free(lemp->outname);
2523 lemp->outname = file_makename(lemp, suffix);
2524 fp = fopen(lemp->outname,mode);
2526 fprintf(stderr,"Can't open file \"%s\".\n",lemp->outname);
2527 lemp->errorcnt++;
2535 void Reprint(lemp) in Reprint() argument
2536 struct lemon *lemp; in Reprint()
2541 printf("// Reprint of input file \"%s\".\n// Symbols:\n",lemp->filename);
2543 for(i=0; i<lemp->nsymbol; i++){
2544 sp = lemp->symbols[i];
2550 skip = (lemp->nsymbol + ncolumns - 1)/ncolumns;
2553 for(j=i; j<lemp->nsymbol; j+=skip){
2554 sp = lemp->symbols[j];
2560 for(rp=lemp->rule; rp; rp=rp->next){
2593 PRIVATE void SetPrint(out,set,lemp) in SetPrint() argument
2596 struct lemon *lemp;
2602 for(i=0; i<lemp->nterminal; i++){
2604 fprintf(out,"%s%s",spacer,lemp->symbols[i]->name);
2658 void ReportOutput(lemp) in ReportOutput() argument
2659 struct lemon *lemp; in ReportOutput()
2667 fp = file_open(lemp,".out","w");
2670 for(i=0; i<lemp->nstate; i++){
2671 stp = lemp->sorted[i];
2673 if( lemp->basisflag ) cfp=stp->bp;
2686 SetPrint(fp,cfp->fws,lemp);
2690 if( lemp->basisflag ) cfp=cfp->bp;
2752 PRIVATE int compute_action(lemp,ap) in compute_action() argument
2753 struct lemon *lemp; in compute_action()
2759 case REDUCE: act = ap->x.rp->index + lemp->nstate; break;
2760 case ERROR: act = lemp->nstate + lemp->nrule; break;
2761 case ACCEPT: act = lemp->nstate + lemp->nrule + 1; break;
2806 PRIVATE FILE *tplt_open(lemp) in tplt_open() argument
2807 struct lemon *lemp; in tplt_open()
2815 cp = strrchr(lemp->filename,'.');
2817 sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
2819 sprintf(buf,"%s.lt",lemp->filename);
2826 tpltname = pathsearch(lemp->argv0,templatename,0);
2831 lemp->errorcnt++;
2837 lemp->errorcnt++;
2844 PRIVATE void tplt_print(out,lemp,str,strln,lineno) in tplt_print() argument
2846 struct lemon *lemp;
2852 fprintf(out,"#line %d \"%s\"\n",strln,lemp->filename); (*lineno)++;
2858 fprintf(out,"\n#line %d \"%s\"\n",*lineno+2,lemp->outname); (*lineno)+=2;
2866 void emit_destructor_code(out,sp,lemp,lineno) in emit_destructor_code() argument
2869 struct lemon *lemp;
2876 cp = lemp->tokendest;
2878 fprintf(out,"#line %d \"%s\"\n{",lemp->tokendestln,lemp->filename);
2881 fprintf(out,"#line %d \"%s\"\n{",sp->destructorln,lemp->filename);
2882 }else if( lemp->vardest ){
2883 cp = lemp->vardest;
2885 fprintf(out,"#line %d \"%s\"\n{",lemp->vardestln,lemp->filename);
2899 fprintf(out,"}\n#line %d \"%s\"\n",*lineno,lemp->outname);
2906 int has_destructor(sp, lemp) in has_destructor() argument
2908 struct lemon *lemp;
2912 ret = lemp->tokendest!=0;
2914 ret = lemp->vardest!=0 || sp->destructor!=0;
2923 PRIVATE void emit_code(out,rp,lemp,lineno) in emit_code() argument
2926 struct lemon *lemp;
2940 fprintf(out,"#line %d \"%s\"\n{",rp->line,lemp->filename);
2967 fprintf(out,"}\n#line %d \"%s\"\n",*lineno,lemp->outname);
2972 ErrorMsg(lemp->filename,rp->ruleline,
2975 lemp->errorcnt++;
2982 ErrorMsg(lemp->filename,rp->ruleline,
2985 lemp->errorcnt++;
2987 if( has_destructor(rp->rhs[i],lemp) ){
3007 void print_stack_union(out,lemp,plineno,mhflag) in print_stack_union() argument
3009 struct lemon *lemp; /* The main info structure for this parser */
3023 arraysize = lemp->nsymbol * 2;
3027 if( lemp->vartype ){
3028 maxdtlength = strlen(lemp->vartype);
3030 for(i=0; i<lemp->nsymbol; i++){
3032 struct symbol *sp = lemp->symbols[i];
3049 for(i=0; i<lemp->nsymbol; i++){
3050 struct symbol *sp = lemp->symbols[i];
3052 if( sp==lemp->errsym ){
3056 if( sp->type!=NONTERMINAL || (sp->datatype==0 && lemp->vartype==0) ){
3061 if( cp==0 ) cp = lemp->vartype;
3092 name = lemp->name ? lemp->name : "Parse";
3096 lemp->tokentype?lemp->tokentype:"void*"); lineno++;
3105 fprintf(out," int yy%d;\n",lemp->errsym->dtnum); lineno++;
3156 void ReportTable(lemp, mhflag) in ReportTable() argument
3157 struct lemon *lemp; in ReportTable()
3173 in = tplt_open(lemp);
3175 out = file_open(lemp,".c","w");
3181 tplt_xfer(lemp->name,in,out,&lineno);
3184 tplt_print(out,lemp,lemp->include,lemp->includeln,&lineno);
3186 char *name = file_makename(lemp, ".h");
3190 tplt_xfer(lemp->name,in,out,&lineno);
3196 if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
3198 for(i=1; i<lemp->nterminal; i++){
3199 fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
3204 tplt_xfer(lemp->name,in,out,&lineno);
3209 minimum_size_type(0, lemp->nsymbol+5)); lineno++;
3210 fprintf(out,"#define YYNOCODE %d\n",lemp->nsymbol+1); lineno++;
3212 minimum_size_type(0, lemp->nstate+lemp->nrule+5)); lineno++;
3213 print_stack_union(out,lemp,&lineno,mhflag);
3214 if( lemp->stacksize ){
3215 if( atoi(lemp->stacksize)<=0 ){
3216 ErrorMsg(lemp->filename,0,
3218 lemp->stacksize);
3219 lemp->errorcnt++;
3220 lemp->stacksize = "100";
3222 fprintf(out,"#define YYSTACKDEPTH %s\n",lemp->stacksize); lineno++;
3229 name = lemp->name ? lemp->name : "Parse";
3230 if( lemp->arg && lemp->arg[0] ){
3232 i = strlen(lemp->arg);
3233 while( i>=1 && isspace(lemp->arg[i-1]) ) i--;
3234 while( i>=1 && (isalnum(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--;
3235 fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg); lineno++;
3236 fprintf(out,"#define %sARG_PDECL ,%s\n",name,lemp->arg); lineno++;
3238 name,lemp->arg,&lemp->arg[i]); lineno++;
3240 name,&lemp->arg[i],&lemp->arg[i]); lineno++;
3250 fprintf(out,"#define YYNSTATE %d\n",lemp->nstate); lineno++;
3251 fprintf(out,"#define YYNRULE %d\n",lemp->nrule); lineno++;
3252 fprintf(out,"#define YYERRORSYMBOL %d\n",lemp->errsym->index); lineno++;
3253 fprintf(out,"#define YYERRSYMDT yy%d\n",lemp->errsym->dtnum); lineno++;
3254 if( lemp->has_fallback ){
3257 tplt_xfer(lemp->name,in,out,&lineno);
3272 ax = malloc( sizeof(ax[0])*lemp->nstate*2 );
3277 for(i=0; i<lemp->nstate; i++){
3278 stp = lemp->sorted[i];
3280 stp->iDflt = lemp->nstate + lemp->nrule;
3284 if( compute_action(lemp,ap)>=0 ){
3285 if( ap->sp->index<lemp->nterminal ){
3287 }else if( ap->sp->index<lemp->nsymbol ){
3290 stp->iDflt = compute_action(lemp, ap);
3308 qsort(ax, lemp->nstate*2, sizeof(ax[0]), axset_compare);
3310 for(i=0; i<lemp->nstate*2 && ax[i].nAction>0; i++){
3315 if( ap->sp->index>=lemp->nterminal ) continue;
3316 action = compute_action(lemp, ap);
3326 if( ap->sp->index<lemp->nterminal ) continue;
3327 if( ap->sp->index==lemp->nsymbol ) continue;
3328 action = compute_action(lemp, ap);
3344 if( action<0 ) action = lemp->nsymbol + lemp->nrule + 2;
3360 if( la<0 ) la = lemp->nsymbol;
3376 n = lemp->nstate;
3379 stp = lemp->sorted[i];
3397 n = lemp->nstate;
3400 stp = lemp->sorted[i];
3416 n = lemp->nstate;
3418 stp = lemp->sorted[i];
3429 tplt_xfer(lemp->name,in,out,&lineno);
3433 if( lemp->has_fallback ){
3434 for(i=0; i<lemp->nterminal; i++){
3435 struct symbol *p = lemp->symbols[i];
3445 tplt_xfer(lemp->name, in, out, &lineno);
3449 for(i=0; i<lemp->nsymbol; i++){
3450 sprintf(line,"\"%s\",",lemp->symbols[i]->name);
3455 tplt_xfer(lemp->name,in,out,&lineno);
3461 for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){
3467 tplt_xfer(lemp->name,in,out,&lineno);
3473 if( lemp->tokendest ){
3474 for(i=0; i<lemp->nsymbol; i++){
3475 struct symbol *sp = lemp->symbols[i];
3479 for(i=0; i<lemp->nsymbol && lemp->symbols[i]->type!=TERMINAL; i++);
3480 if( i<lemp->nsymbol ){
3481 emit_destructor_code(out,lemp->symbols[i],lemp,&lineno);
3485 for(i=0; i<lemp->nsymbol; i++){
3486 struct symbol *sp = lemp->symbols[i];
3489 emit_destructor_code(out,lemp->symbols[i],lemp,&lineno);
3492 if( lemp->vardest ){
3494 for(i=0; i<lemp->nsymbol; i++){
3495 struct symbol *sp = lemp->symbols[i];
3502 emit_destructor_code(out,dflt_sp,lemp,&lineno);
3506 tplt_xfer(lemp->name,in,out,&lineno);
3509 tplt_print(out,lemp,lemp->overflow,lemp->overflowln,&lineno);
3510 tplt_xfer(lemp->name,in,out,&lineno);
3517 for(rp=lemp->rule; rp; rp=rp->next){
3520 tplt_xfer(lemp->name,in,out,&lineno);
3523 for(rp=lemp->rule; rp; rp=rp->next){
3525 emit_code(out,rp,lemp,&lineno);
3528 tplt_xfer(lemp->name,in,out,&lineno);
3531 tplt_print(out,lemp,lemp->failure,lemp->failureln,&lineno);
3532 tplt_xfer(lemp->name,in,out,&lineno);
3535 tplt_print(out,lemp,lemp->error,lemp->errorln,&lineno);
3536 tplt_xfer(lemp->name,in,out,&lineno);
3539 tplt_print(out,lemp,lemp->accept,lemp->acceptln,&lineno);
3540 tplt_xfer(lemp->name,in,out,&lineno);
3543 tplt_print(out,lemp,lemp->extracode,lemp->extracodeln,&lineno);
3551 void ReportHeader(lemp) in ReportHeader() argument
3552 struct lemon *lemp; in ReportHeader()
3560 if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
3562 in = file_open(lemp,".h","r");
3564 for(i=1; i<lemp->nterminal && fgets(line,LINESIZE,in); i++){
3565 sprintf(pattern,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
3569 if( i==lemp->nterminal ){
3574 out = file_open(lemp,".h","w");
3576 for(i=1; i<lemp->nterminal; i++){
3577 fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
3590 void CompressTables(lemp) in CompressTables() argument
3591 struct lemon *lemp; in CompressTables()
3599 for(i=0; i<lemp->nstate; i++){
3600 stp = lemp->sorted[i];