home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s7 / nelex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  4.9 KB  |  238 lines

  1. #
  2. #include "ne.h"
  3. #include "y.tab.c"
  4.  
  5. char *cntrl[] {
  6.     "sup", "super", "sub",
  7.     ".EN",
  8.     "sum", "from", "to",
  9.     "hat", "dot", "dotdot", "bar", "tilde", "under",
  10.     "prod", "int", "integral", "union", "inter",
  11.     "pile", "lpile", "cpile", "rpile", "over", "sqrt",
  12.     "above", "size", "font", "roman", "italic", "bold",
  13.     "left", "right",
  14.     "delim", "DELIM",
  15.     "DEFINE","define",
  16.     ".gsize", ".GSIZE", "gsize", "GSIZE", "gfont", "GFONT",
  17.     "HAT", "DOT", "DOTDOT", "BAR", "TILDE", "UNDER",
  18.     "PROD", "INT", "INTEGRAL", "UNION", "INTER",
  19.     "SUM", "FROM", "TO",
  20.     "SUP", "SUPER", "SUB", "PILE", "LPILE", "CPILE", "RPILE", "OVER", "SQRT",
  21.     "ABOVE", "SIZE", "FONT", "ROMAN", "ITALIC", "BOLD",
  22.     "LEFT", "RIGHT", 
  23.     "up", "UP", "down", "DOWN", "fwd", "FWD", "back", "BACK",
  24.     "mark", "MARK", "lineup", "LINEUP",
  25.     "matrix", "lcol", "ccol", "rcol", "col",
  26.     0};
  27.  
  28.  
  29. int icntrl[]{
  30.     SUPER, SUPER, SUB,
  31.     0, /* EOF */
  32.     SUM, FROM, TO,
  33.     HAT, DOT, DOTDOT, BAR, TILDE, UNDER,
  34.     PROD, INT, INT, UNION, INTER,
  35.     PILE, LPILE, CPILE, RPILE, OVER, SQRT,
  36.     ABOVE, SIZE, FONT, ROMAN, ITALIC, BOLD,
  37.     LEFT, RIGHT,
  38.     DELIM, DELIM,
  39.     DEFINE, DEFINE,
  40.     GSIZE, GSIZE, GSIZE, GSIZE, GFONT, GFONT,
  41.     HAT, DOT, DOTDOT, BAR, TILDE, UNDER,
  42.     PROD, INT, INT, UNION, INTER,
  43.     SUM, FROM, TO,
  44.     SUPER, SUPER, SUB, PILE, LPILE, CPILE, RPILE, OVER, SQRT,
  45.     ABOVE, SIZE, FONT, ROMAN, ITALIC, BOLD,
  46.     LEFT, RIGHT,
  47.     UP, UP, DOWN, DOWN, FWD, FWD, BACK, BACK,
  48.     MARK, MARK, LINEUP, LINEUP,
  49.     MATRIX, LCOL, CCOL, RCOL, COL,
  50.     0};
  51.  
  52. int    peek    -1;
  53. #define    SSIZE    400
  54. char    token[SSIZE];
  55. int    sp;
  56. int speek[10];
  57. char *swt[10];
  58. int sw -1;
  59.  
  60. getc(){
  61.   loop:
  62.     if(sw >= 0){
  63.         lastchar = (peek<0) ? *swt[sw]++ : peek;
  64.         peek = -1;
  65.         if(lastchar != '\0')return(lastchar);
  66.         peek = speek[sw--];
  67.         return(' ');
  68.         }
  69.     lastchar = (peek<0) ? getchar() : peek;
  70.     if( lastchar=='\n' )
  71.         linect++;
  72.     peek = -1;
  73.     if( lastchar!= '\0' )
  74.         return(lastchar);
  75.     if( ++ifile > svargc ){
  76.         peek = '\0';
  77.         return('\0');
  78.     }
  79.     close(fin);
  80.     linect = 1;
  81.     if( (fin=open(svargv[ifile],0)) >= 0 )
  82.         goto loop;
  83.     error(FATAL,"can't open file %s\n", svargv[ifile]);
  84. }
  85.  
  86. yylex(){
  87.     int c, type;
  88.   beg:
  89.     while( (c=getc())==' ' || c=='\n');
  90.     yylval=c;
  91.     switch(c){
  92.  
  93.     case '\0':
  94.         return('\0');
  95.     case '~':
  96.         return(SPACE);
  97.     case '^':
  98.         return(THIN);
  99.     case '\t':
  100.         return(TAB);
  101.     case '{':
  102.         return(MQ);
  103.     case '}':
  104.         return(MQ1);
  105.     case '"':
  106.         for(sp=0; (c=getc())!='"'; ){
  107.             if(c !='\\')token[sp++]=c;
  108.             else { if((c=getc())!= '"')token[sp++]='\\';
  109.                 token[sp++] = c; }
  110.             if( sp>=SSIZE )
  111.                 error(FATAL,"quoted string %.20s... too long", token);
  112.         }
  113.         token[sp]='\0';
  114.         yylval= &token[0];
  115.         return(QTEXT);
  116.     }
  117.     if( c==righteq )
  118.         return('\0');
  119.  
  120.     getstr(token, c);
  121.     if((type = lookup(token,nptr)) >= 0){
  122.         if(sw >= 9)
  123.             error(FATAL,"definitions nested > 9", sw);
  124.         swt[++sw] = sptr[type];
  125.         speek[sw] = peek;
  126.         peek = -1;
  127.         goto beg;
  128.         }
  129.     type = lookup(token,cntrl);
  130.     if( type < 0 )
  131.         return(CONTIG);
  132.     if( icntrl[type]==DEFINE ) {
  133.         define();
  134.         goto beg;
  135.     }
  136.     else if( icntrl[type]==DELIM ) {
  137.         delim();
  138.         goto beg;
  139.     }
  140.     else if( icntrl[type]==GSIZE ){
  141.         globsize();
  142.         goto beg;
  143.     }
  144.     else if( icntrl[type]==GFONT ) {
  145.         globfont();
  146.         goto beg;
  147.     }
  148.     else
  149.         return( icntrl[type] );
  150. }
  151.  
  152. getstr(s,c) char *s, c; {
  153.     for (sp=0; c!=' ' && c!='\t' && c!='\n' && c!='{' && c!='}'
  154.         && c!='"' && c!='~' && c!='^' && c!=righteq; ) {
  155.         if(c == '\\') if((c = getc()) != '"')s[sp++] = '\\';
  156.         s[sp++] = c;
  157.         if( sp>=SSIZE )
  158.             error(FATAL,"token %.20s... too long",s);
  159.         c = getc();
  160.         }
  161.     if( c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq )
  162.         peek = c;
  163.     s[sp]='\0';
  164.     yylval = s;
  165. }
  166.  
  167. lookup(str,tbl) char *str; char *tbl[]; {
  168.     register i,j, r;
  169.     for(i=0; tbl[i]!=0; i++){ /* table of tbl wds */
  170.         for( j=0; (r=tbl[i][j])==str[j] && r!='\0'; j++);
  171.         if( r == str[j] )
  172.             return(i);
  173.     }
  174.     return( -1 );
  175. }
  176.  
  177. cstr(s,quote) char *s; int quote; {
  178.     int del,c,i;
  179.     while((del=getc()) == ' ' || del == '\t' || del == '\n');
  180.     if(quote)
  181.         for(i=0; (c=getc()) != del;)
  182.             s[i++] = c;
  183.     else {
  184.         s[0] = del;
  185.         for(i=1; (c=getc())!=' ' && c!= '\t' && c!='\n';)
  186.             s[i++]=c;
  187.     }
  188.     s[i] = '\0';
  189.     return(s);
  190. }
  191.  
  192. define() {
  193.     char *alloc();
  194.     int i, c;
  195.     while( (c=getc())==' ' || c=='\n' );
  196.     getstr(token,c);
  197.     if((i = lookup(token,nptr)) >= 0){
  198.         yyval = i;
  199.         free(sptr[yyval]);
  200.     } else {
  201.         yyval = ptr++;
  202.         for(i=0; token[i] != '\0'; i++);
  203.         nptr[yyval] = alloc(i+1);
  204.         for(i=0; nptr[yyval][i]=token[i]; i++);
  205.     }
  206.     if(dbg)printf(".\tdefine %s\n",nptr[yyval]);
  207.     cstr(token,1);
  208.     for(i=0; token[i] != '\0'; i++);
  209.     sptr[yyval] = alloc(i+1);
  210.     for(i=0; sptr[yyval][i] = token[i]; i++);
  211.     if(dbg)printf(".\tname %s defined as %s\n",nptr[yyval],sptr[yyval]);
  212. }
  213.  
  214. delim() {
  215.     char *s;
  216.     yyval = eqnreg = 0;
  217.     cstr(token,0);
  218.     lefteq = token[0];
  219.     righteq = token[1];
  220.     if( (lefteq == 'o' && righteq == 'f') || (lefteq == 'O' && righteq == 'F') )
  221.         lefteq = righteq = '\0';
  222. }
  223.  
  224. globsize() {
  225.     extern int gsize;
  226.     int c;
  227.     while( (c=getc())==' ' || c=='\n' );
  228.     getstr(token,c);
  229.     gsize = numb(token);
  230.     yyval = eqnreg = 0;
  231. }
  232.  
  233. globfont() {
  234.     extern int gfont;
  235.     while( (gfont=getc())==' ' || gfont=='\n' );
  236.     yyval = eqnreg = 0;
  237. }
  238.