|
|
1.1 ! root 1: /* ! 2: * pretty print routines ! 3: */ ! 4: #include "yacc.h" ! 5: ! 6: static char ctab[] = " |"; ! 7: listgram() ! 8: { ! 9: register i, k, j; ! 10: register struct sym *sp; ! 11: struct prod *pp; ! 12: ! 13: if( !verbose ) ! 14: return; ! 15: fprintf(listout,"Input grammar:\n\n"); ! 16: for(i=0; i<nnonterm; i++) { ! 17: sp = ntrmptr[i]; ! 18: fprintf(listout,"%s:\n\n", sp->s_name); ! 19: for(j=0; j<sp->s_nprods; j++ ) { ! 20: pp = sp->s_prods[j]; ! 21: fprintf(listout, "%d:\t%c ", pp->p_prodno, ctab[j!=0]); ! 22: for(k=0; pp->p_right[k]>=0; k++) { ! 23: fprintf(listout, "%s ", ptosym(pp->p_right[k])); ! 24: } ! 25: fprintf(listout, "\n"); ! 26: } ! 27: fprintf(listout,"\t;\n\n"); ! 28: } ! 29: } ! 30: ! 31: prstate(i, f) ! 32: FILE *f; ! 33: { ! 34: register j; ! 35: register struct sitem *itp; ! 36: ! 37: itp = items[i]; ! 38: fprintf(f, "State %d:\n\n", i); ! 39: for(j=0; j<itp->i_nitems; j++) ! 40: pritem(itp->i_items[j],f); ! 41: fprintf(f, "\n"); ! 42: } ! 43: ! 44: pritem(ip,f) ! 45: register int *ip; ! 46: FILE *f; ! 47: { ! 48: register int *pp; ! 49: ! 50: pp = ip; ! 51: do ; while( *--pp >= 0 ); ! 52: fprintf(f,"\t"); ! 53: fprintf(f, "%s <- ", ptosym(-*pp++)); ! 54: while( pp!=ip ) { ! 55: fprintf(f, "%s ", ptosym(*pp++)); ! 56: } ! 57: fprintf(f, "_ "); ! 58: while( *pp!=-1 ) ! 59: fprintf(f, "%s ", ptosym(*pp++)); ! 60: fprintf(f,"\n"); ! 61: } ! 62: ! 63: char * ! 64: ptosym(n) ! 65: register n; ! 66: { ! 67: if( n>=NTBASE ) ! 68: return( ntrmptr[n-NTBASE]->s_name); ! 69: else ! 70: return( trmptr[n]->s_name); ! 71: } ! 72: ! 73: char * ! 74: prsym(c) ! 75: register c; ! 76: { ! 77: static char s[10]; ! 78: ! 79: if( c<040 || c>= 0177 ) { ! 80: switch( c ) { ! 81: case '\n': ! 82: sprintf(s, "'\\n'"); ! 83: break; ! 84: ! 85: case '\r': ! 86: sprintf(s, "'\\r'"); ! 87: break; ! 88: ! 89: case '\t': ! 90: sprintf(s, "'\\t'"); ! 91: break; ! 92: ! 93: case '\b': ! 94: sprintf(s,"'\\b'"); ! 95: break; ! 96: ! 97: case '\f': ! 98: sprintf(s, "'\\f'"); ! 99: break; ! 100: ! 101: case '\0': ! 102: sprintf(s, "'\\0'"); ! 103: break; ! 104: ! 105: default: ! 106: sprintf(s, "'\\%3o'", c); /* MWC DSC */ ! 107: } ! 108: } else ! 109: sprintf(s, "'%c'", c); ! 110: return( s ); ! 111: } ! 112: ! 113: options(argc, argv) ! 114: int argc; ! 115: char *argv[]; ! 116: { ! 117: register i; ! 118: register char *ap; ! 119: ! 120: for(i=1; i<argc; i++) { ! 121: ap = argv[i]; ! 122: if( ap[0]!='-' || strcmp(ap,"-")==0 ) ! 123: gramy = argv[i]; ! 124: else ! 125: if( strcmp(ap,"-v")==0 ) ! 126: verbose++; ! 127: else ! 128: if( strcmp(ap,"-l")==0 ) { ! 129: verbose++; ! 130: youtput = nextarg(argv[++i]); ! 131: } ! 132: else ! 133: if( strcmp(ap, "-st")==0 ) { ! 134: pstat++; ! 135: } ! 136: else ! 137: if( strcmp(ap,"-hdr")==0 ) { ! 138: ytabh = nextarg(argv[++i]); ! 139: } ! 140: else ! 141: if( strcmp(ap,"-d")==0 ) { ! 142: yydebug++; ! 143: verbose++; ! 144: } ! 145: else ! 146: if( strcmp(ap,"-prods")==0 ) ! 147: maxprod = getnum(argv[++i]); ! 148: else ! 149: if( strcmp(ap,"-terms")==0 ) ! 150: maxterm = getnum(argv[++i]); ! 151: else ! 152: if( strcmp(ap,"-nterms")==0 ) ! 153: maxnterm = getnum(argv[++i]); ! 154: else ! 155: if( strcmp(ap,"-states")==0 ) ! 156: maxstates = getnum(argv[++i]); ! 157: else ! 158: if( strcmp(ap,"-types")==0 ) ! 159: maxtype = getnum(argv[++i]); ! 160: else ! 161: usage(); ! 162: if( maxterm >= LSETSIZE*NBCHAR ) ! 163: yyerror(NLNO|FATAL, "get ciaran to change alloc for lsets"); ! 164: } ! 165: /* ! 166: * if( (maxterm+maxnterm+maxtype) >= MAXSYM ) ! 167: * yyerror(NLNO|FATAL, "increase MAXSYM"); ! 168: * ! 169: * MWC DSC - make it all flexible with maxsym - it will also mean less memory ! 170: * allocated, in most cases. ! 171: */ ! 172: prdptr = (struct prod **)yalloc(maxprod, sizeof *prdptr); ! 173: symtab = (struct sym **)yalloc(maxsym+1, sizeof *symtab); /* MWC DSC */ ! 174: ntrmptr = (struct sym **)yalloc(maxnterm, sizeof *ntrmptr); ! 175: trmptr = (struct sym **)yalloc(maxterm, sizeof *trmptr); ! 176: typeptr = (struct sym **)yalloc(maxtype, sizeof *typeptr); ! 177: nitprod = (struct prod *)yalloc(1, sizeof *nitprod + sizeof(int) * MAXPRODL); ! 178: nititem = (struct sitem *)yalloc(1, sizeof *nititem + MAXITEM * sizeof nititem-> ! 179: i_items[0]); ! 180: states = (struct state *)yalloc(maxstates, sizeof *states); ! 181: items = (struct sitem **)yalloc(maxstates, sizeof *items); ! 182: } ! 183: ! 184: yyerror(type, args) ! 185: { ! 186: if( type&FATAL ) ! 187: fprintf(stderr, "fatal error: "); ! 188: if( (type&NLNO)==0 ) ! 189: fprintf(stderr, "line %d: ", yyline); ! 190: fprintf(stderr, "%r", &args); ! 191: fprintf(stderr, "\n"); ! 192: if( type&FATAL ) ! 193: cleanup(2); ! 194: if( (type&WARNING)==0 ) ! 195: nerrors++; ! 196: if( type&SKIP ) ! 197: while( llgetc()!='\n' ) /* MWC DSC */ ! 198: ; ! 199: } ! 200: ! 201: getnum(s) ! 202: char *s; ! 203: { ! 204: if( s==NULL ) ! 205: yyerror(NLNO|FATAL, "missing argument"); ! 206: return( atoi(s) ); ! 207: } ! 208: ! 209: char * /* MWC DSC */ ! 210: nextarg(s) ! 211: char *s; ! 212: { ! 213: if( s==NULL ) ! 214: yyerror(NLNO|FATAL, "missing file name"); ! 215: return( s ); ! 216: } ! 217: ! 218: usage() ! 219: { ! 220: fprintf(stderr, "Usage: yacc [options] [parameters] grammar\n"); ! 221: fprintf(stderr, "Options: -v -d -l file -hdr file -st\n"); ! 222: fprintf(stderr,"Parameters: -prods # -terms # - nterms # -states # -types #\n"); ! 223: exit(1); ! 224: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.