|
|
1.1 ! root 1: %Start A str def thru sh ! 2: ! 3: %{ ! 4: #undef input ! 5: #undef unput ! 6: #include <stdio.h> ! 7: #include <stdlib.h> ! 8: #include <ctype.h> ! 9: #include "grap.h" ! 10: #include "y.tab.h" ! 11: ! 12: extern struct symtab symtab[]; ! 13: ! 14: int yyback(int *, int); ! 15: int yylook(void); ! 16: int yywrap(void); ! 17: void shell_init(void), shell_exec(void), shell_text(char *); ! 18: ! 19: #define CADD cbuf[clen++] = yytext[0]; \ ! 20: if (clen >= CBUFLEN-1) { \ ! 21: ERROR "string too long", cbuf WARNING; BEGIN A; } ! 22: #define CBUFLEN 1500 ! 23: char cbuf[CBUFLEN]; ! 24: int clen, cflag; ! 25: int c, delim, shcnt; ! 26: %} ! 27: ! 28: A [a-zA-Z_] ! 29: B [a-zA-Z0-9_] ! 30: D [0-9] ! 31: WS [ \t] ! 32: ! 33: %% ! 34: if (yybgin-yysvec-1 == 0) { /* witchcraft */ ! 35: BEGIN A; ! 36: } ! 37: ! 38: <A>{WS} ; ! 39: <A>"\\"\n ; ! 40: <A>\n return(ST); ! 41: <A>";" return(ST); ! 42: ! 43: <A>line return(yylval.i = LINE); ! 44: <A>arrow { yylval.i = ARROW; return(LINE); } ! 45: <A>circle return(yylval.i = CIRCLE); ! 46: <A>frame return(FRAME); ! 47: <A>tick(s)? return(TICKS); ! 48: <A>grid(line)?(s)? return(GRID); ! 49: <A>coord(s)? return(COORD); ! 50: <A>log return(LOG); ! 51: <A>exp return(EXP); ! 52: <A>sin return(SIN); ! 53: <A>cos return(COS); ! 54: <A>atan2 return(ATAN2); ! 55: <A>sqrt return(SQRT); ! 56: <A>rand return(RAND); ! 57: <A>max return(MAX); ! 58: <A>min return(MIN); ! 59: <A>int return(INT); ! 60: <A>print return(PRINT); ! 61: <A>sprintf return(SPRINTF); ! 62: <A>pic{WS}.* { yylval.p = tostring(yytext+3); return(PIC); } ! 63: <A>graph{WS}.* { yylval.p = tostring(yytext+5); return(GRAPH); } ! 64: ! 65: <A>for return(FOR); ! 66: <A>^Endfor\n { endfor(); } ! 67: <A>do { yylval.p = delimstr("loop body"); BEGIN A; return(DOSTR); } ! 68: ! 69: <A>copy|include { return(COPY); } ! 70: <A>thru|through { BEGIN thru; return(THRU); } ! 71: <thru>{WS}+ ; ! 72: <thru>{A}{B}*|. { yylval.op = copythru(yytext); BEGIN A; return(DEFNAME); } ! 73: <A>until return(UNTIL); ! 74: ! 75: <A>if return(IF); ! 76: <A>then { yylval.p = delimstr("then part"); BEGIN A; return(THEN); } ! 77: <A>else { yylval.p = delimstr("else part"); BEGIN A; return(ELSE); } ! 78: ! 79: <A>next return(NEXT); ! 80: <A>draw return(yylval.i = DRAW); ! 81: <A>new return(yylval.i = NEW); ! 82: <A>plot return(yylval.i = PLOT); ! 83: <A>label(s)? return(LABEL); ! 84: <A>x return(X); ! 85: <A>y return(Y); ! 86: ! 87: <A>top { yylval.i = TOP; return SIDE; } ! 88: <A>bot(tom)? { yylval.i = BOT; return SIDE; } ! 89: <A>left { yylval.i = LEFT; return SIDE; } ! 90: <A>right { yylval.i = RIGHT; return SIDE; } ! 91: <A>up return(yylval.i = UP); ! 92: <A>down return(yylval.i = DOWN); ! 93: <A>across return(yylval.i = ACROSS); ! 94: <A>height|ht return(yylval.i = HEIGHT); ! 95: <A>wid(th)? return(yylval.i = WIDTH); ! 96: <A>rad(ius)? return(yylval.i = RADIUS); ! 97: <A>invis return(yylval.i = INVIS); ! 98: <A>dot(ted) return(yylval.i = DOT); ! 99: <A>dash(ed) return(yylval.i = DASH); ! 100: <A>solid return(yylval.i = SOLID); ! 101: ! 102: <A>ljust { yylval.i = LJUST; return JUST; } ! 103: <A>rjust { yylval.i = RJUST; return JUST; } ! 104: <A>above { yylval.i = ABOVE; return JUST; } ! 105: <A>below { yylval.i = BELOW; return JUST; } ! 106: <A>size return(yylval.i = SIZE); ! 107: ! 108: <A>from return(yylval.i = FROM); ! 109: <A>to return(yylval.i = TO); ! 110: <A>by|step return(yylval.i = BY); ! 111: <A>at return(yylval.i = AT); ! 112: <A>with return(yylval.i = WITH); ! 113: <A>in return(yylval.i = IN); ! 114: <A>out return(yylval.i = OUT); ! 115: <A>off return(yylval.i = OFF); ! 116: ! 117: <A>sh{WS}+ { BEGIN sh; ! 118: if ((delim = input()) == '{') { ! 119: shcnt = 1; ! 120: delim = '}'; ! 121: } ! 122: shell_init(); ! 123: } ! 124: <sh>{A}{B}* { ! 125: int c; ! 126: Obj *p; ! 127: if (yytext[0] == delim) { ! 128: shell_exec(); ! 129: BEGIN A; ! 130: } else { ! 131: p = lookup(yytext, 0); ! 132: if (p != NULL && p->type == DEFNAME) { ! 133: c = input(); ! 134: unput(c); ! 135: if (c == '(') ! 136: dodef(p); ! 137: else ! 138: pbstr(p->val); ! 139: } else ! 140: shell_text(yytext); ! 141: } ! 142: } ! 143: <sh>"{" { shcnt++; shell_text(yytext); } ! 144: <sh>"}" { if (delim != '}' || --shcnt > 0) ! 145: shell_text(yytext); ! 146: else { ! 147: shell_exec(); ! 148: BEGIN A; ! 149: } ! 150: } ! 151: <sh>.|\n { if (yytext[0] == delim) { ! 152: shell_exec(); ! 153: BEGIN A; ! 154: } else ! 155: shell_text(yytext); ! 156: } ! 157: ! 158: <A>define{WS}+ { BEGIN def; } ! 159: <def>{A}{B}* { definition(yytext); BEGIN A; } ! 160: ! 161: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? { ! 162: yylval.f = atof(yytext); return(NUMBER); } ! 163: ! 164: <A>^"."[^0-9].* { if (yytext[1] == 'G' && yytext[2] == '2') { ! 165: yylval.i = yytext[2]; ! 166: return(EOF); ! 167: } else { ! 168: yylval.p = tostring(yytext); ! 169: return(PIC); ! 170: } ! 171: } ! 172: ! 173: <A>{A}{B}* { ! 174: int c; ! 175: Obj *p; ! 176: p = lookup(yytext, 1); ! 177: if (p->type == DEFNAME) { ! 178: c = input(); ! 179: unput(c); ! 180: if (c == '(') /* it's name(...) */ ! 181: dodef(p); ! 182: else /* no argument list */ ! 183: pbstr(p->val); ! 184: } else { ! 185: yylval.op = p; ! 186: return p->type; /* NAME or VARNAME */ ! 187: } ! 188: } ! 189: ! 190: <A>"==" return(EQ); ! 191: <A>">=" return(GE); ! 192: <A>"<=" return(LE); ! 193: <A>"!=" return(NE); ! 194: <A>">" return(GT); ! 195: <A>"<" return(LT); ! 196: <A>"&&" return(AND); ! 197: <A>"||" return(OR); ! 198: <A>"!" return(NOT); ! 199: ! 200: <A>\" { BEGIN str; clen = 0; } ! 201: ! 202: <A>#.* ; ! 203: ! 204: <A>. { yylval.i = yytext[0]; return(yytext[0]); } ! 205: ! 206: <str>\" { BEGIN A; cbuf[clen] = 0; ! 207: yylval.p = tostring(cbuf); return(STRING); } ! 208: <str>\n { ERROR "newline in string" WARNING; BEGIN A; return(ST); } ! 209: <str>"\\\"" { cbuf[clen++] = '\\'; cbuf[clen++] = '"'; } ! 210: <str>"\\\\" { cbuf[clen++] = '\\'; cbuf[clen++] = '\\'; } ! 211: <str>. { CADD; } ! 212: ! 213: %%
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.