grapl.lx 4.8 KB

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