plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

picl.lx (7549B)


      1 %Start A str def sc br thru sh
      2 %e 1700
      3 %k 120
      4 %a 1800
      5 %o 1500
      6 %p 5000
      7 %n 700
      8 
      9 %{
     10 #undef	input
     11 #undef	unput
     12 /* #include <stdio.h> lex puts one out for us */
     13 #include <ctype.h>
     14 #include <stdlib.h>
     15 #include "pic.h"
     16 #include "y.tab.h"
     17 
     18 extern	char	*filename;
     19 extern	struct	symtab	symtab[];
     20 
     21 void	pbstr(char *);
     22 void	dodef(struct symtab *stp);
     23 void	undefine(char *s);
     24 void	shell_init(void), shell_exec(void), shell_text(char *);
     25 void	endfor(void);
     26 
     27 int	yyback(int *, int);
     28 int	yylook(void);
     29 int	yywrap(void);
     30 
     31 #define	CADD	cbuf[clen++]=yytext[0]; \
     32 		if (clen>=CBUFLEN-1) { ERROR "string too long" WARNING; BEGIN A; }
     33 #define	CBUFLEN	500
     34 char	cbuf[CBUFLEN];
     35 int	c, clen, cflag, delim;
     36 int	ifsw	= 0;	/* 1 if if statement in progress */
     37 %}
     38 
     39 A	[a-zA-Z_]
     40 B	[a-zA-Z0-9_]
     41 D	[0-9]
     42 WS	[ \t]
     43 
     44 %%
     45 	switch (yybgin-yysvec-1) {	/* witchcraft */
     46 	case 0:
     47 		BEGIN A;
     48 		break;
     49 	case sc:
     50 		BEGIN A;
     51 		return('}');
     52 	case br:
     53 		BEGIN A;
     54 		return(']');
     55 	}
     56 
     57 <A>{WS}		;
     58 <A>"\\"\n	;
     59 <A>\n		{ return(ST); }
     60 <A>";"		{ return(ST); }
     61 <A>"}"		{ BEGIN sc; return(ST); }
     62 <A>"]"		{ BEGIN br; return(ST); }
     63 <A>"{"{WS}*(#.*)?\n+	{ return(yylval.i = yytext[0]); }
     64 
     65 <A>^".PS".*	{ if (curfile == infile) ERROR ".PS found inside .PS/.PE" WARNING; }
     66 <A>^".PE".*	{ if (curfile == infile) {
     67 			yylval.p = PEstring = tostring(yytext);
     68 			return(EOF);
     69 		  }
     70 		}
     71 <A>^".".*	{ yylval.p = tostring(yytext); return(TROFF); }
     72 
     73 <A>print	return(yylval.i = PRINT);
     74 <A>box		return(yylval.i = BOX);
     75 <A>circle	return(yylval.i = CIRCLE);
     76 <A>arc		return(yylval.i = ARC);
     77 <A>ellipse	return(yylval.i = ELLIPSE);
     78 <A>arrow	return(yylval.i = ARROW);
     79 <A>spline	return(yylval.i = SPLINE);
     80 <A>line		return(yylval.i = LINE);
     81 <A>move		return(yylval.i = MOVE);
     82 <A>"[]"		return(yylval.i = BLOCK);
     83 <A>reset	return(RESET);
     84 <A>sprintf	return(SPRINTF);
     85 
     86 <A>same		return(SAME);
     87 <A>between	return(BETWEEN);
     88 <A>and		return(AND);
     89 
     90 <A>of		;
     91 <A>the		;
     92 <A>way		;
     93 
     94 <A>"."(e|east)		{ yylval.i = EAST; return(CORNER); }
     95 <A>"."(r|right)		{ yylval.i = EAST; return(CORNER); }
     96 <A>"."(w|west)		{ yylval.i = WEST; return(CORNER); }
     97 <A>"."(l|left)		{ yylval.i = WEST; return(CORNER); }
     98 <A>"."(n|north)		{ yylval.i = NORTH; return(CORNER); }
     99 <A>"."(t|top)		{ yylval.i = NORTH; return(CORNER); }
    100 <A>"."(s|south)		{ yylval.i = SOUTH; return(CORNER); }
    101 <A>"."(b|bot|bottom)	{ yylval.i = SOUTH; return(CORNER); }
    102 <A>"."(c|center)	{ yylval.i = CENTER; return(CORNER); }
    103 <A>".start"		{ yylval.i = START; return(CORNER); }
    104 <A>".end"		{ yylval.i = END; return(CORNER); }
    105 <A>".ne"		{ yylval.i = NE; return(CORNER); }
    106 <A>".se"		{ yylval.i = SE; return(CORNER); }
    107 <A>".nw"		{ yylval.i = NW; return(CORNER); }
    108 <A>".sw"		{ yylval.i = SW; return(CORNER); }
    109 
    110 <A>top" "+of		{ yylval.i = NORTH; return(CORNER); }
    111 <A>north" "+of		{ yylval.i = NORTH; return(CORNER); }
    112 <A>bottom" "+of		{ yylval.i = SOUTH; return(CORNER); }
    113 <A>south" "+of		{ yylval.i = SOUTH; return(CORNER); }
    114 <A>left" "+of		{ yylval.i = WEST; return(CORNER); }
    115 <A>west" "+of		{ yylval.i = WEST; return(CORNER); }
    116 <A>right" "+of		{ yylval.i = EAST; return(CORNER); }
    117 <A>east" "+of		{ yylval.i = EAST; return(CORNER); }
    118 <A>center" "+of		{ yylval.i = CENTER; return(CORNER); }
    119 <A>start" "+of		{ yylval.i = START; return(CORNER); }
    120 <A>end" "+of		{ yylval.i = END; return(CORNER); }
    121 
    122 <A>height|ht	{ yylval.i = HEIGHT; return(ATTR); }
    123 <A>width|wid	{ yylval.i = WIDTH; return(ATTR); }
    124 <A>radius|rad	{ yylval.i = RADIUS; return(ATTR); }
    125 <A>diameter|diam { yylval.i = DIAMETER; return(ATTR); }
    126 <A>size		{ yylval.i = SIZE; return(ATTR); }
    127 <A>left		{ yylval.i = LEFT; return(DIR); }
    128 <A>right	{ yylval.i = RIGHT; return(DIR); }
    129 <A>up		{ yylval.i = UP; return(DIR); }
    130 <A>down		{ yylval.i = DOWN; return(DIR); }
    131 <A>cw		{ yylval.i = CW; return(ATTR); }
    132 <A>clockwise	{ yylval.i = CW; return(ATTR); }
    133 <A>ccw		{ yylval.i = CCW; return(ATTR); }
    134 <A>invis(ible)?	{ yylval.i = INVIS; return(ATTR); }
    135 <A>noedge	{ yylval.i = INVIS; return ATTR; }
    136 <A>fill		{ yylval.i = FILL; return ATTR; }
    137 <A>solid	;
    138 <A>dot(ted)?	return(yylval.i = DOT);
    139 <A>dash(ed)?	return(yylval.i = DASH);
    140 <A>chop		return(yylval.i = CHOP);
    141 
    142 <A>spread	{ yylval.i = SPREAD; return TEXTATTR; }
    143 <A>ljust	{ yylval.i = LJUST; return TEXTATTR; }
    144 <A>rjust	{ yylval.i = RJUST; return TEXTATTR; }
    145 <A>above	{ yylval.i = ABOVE; return TEXTATTR; }
    146 <A>below	{ yylval.i = BELOW; return TEXTATTR; }
    147 <A>center	{ yylval.i = CENTER; return TEXTATTR; }
    148 
    149 <A>"<-"		{ yylval.i = HEAD1; return(HEAD); }
    150 <A>"->"		{ yylval.i = HEAD2; return(HEAD); }
    151 <A>"<->"	{ yylval.i = HEAD12; return(HEAD); }
    152 
    153 <A>".x"			return(yylval.i = DOTX);
    154 <A>".y"			return(yylval.i = DOTY);
    155 <A>"."(ht|height)	return(yylval.i = DOTHT);
    156 <A>"."(wid|width)	return(yylval.i = DOTWID);
    157 <A>"."(rad|radius)	return(yylval.i = DOTRAD);
    158 
    159 <A>from		return(yylval.i = FROM);
    160 <A>to		return(yylval.i = TO);
    161 <A>at		return(yylval.i = AT);
    162 <A>by		return(yylval.i = BY);
    163 <A>with		return(yylval.i = WITH);
    164 <A>last		return(yylval.i = LAST);
    165 
    166 <A>log		return(LOG);
    167 <A>exp		return(EXP);
    168 <A>sin		return(SIN);
    169 <A>cos		return(COS);
    170 <A>atan2	return(ATAN2);
    171 <A>sqrt		return(SQRT);
    172 <A>rand		return(RAND);
    173 <A>max		return(MAX);
    174 <A>min		return(MIN);
    175 <A>int		return(INT);
    176 
    177 <A>"=="		return(EQ);
    178 <A>">="		return(GE);
    179 <A>"<="		return(LE);
    180 <A>"!="		return(NEQ);
    181 <A>">"		return(GT);
    182 <A>"<"		return(LT);
    183 <A>"&&"		return(ANDAND);
    184 <A>"||"		return(OROR);
    185 <A>"!"		return(NOT);	
    186 
    187 <A>Here		return(yylval.i = HERE);
    188 
    189 <A>for		return(FOR);
    190 <A>^Endfor\n	{ endfor(); }
    191 <A>do		{ yylval.p = delimstr("loop body"); return(DOSTR); }
    192 
    193 <A>copy|include		return(COPY);
    194 <A>(thru|through){WS}+	{ BEGIN thru; return(THRU); }
    195 <thru>{A}{B}*|.		{ yylval.st = copythru(yytext); BEGIN A; return(DEFNAME); }
    196 <A>until		return(UNTIL);
    197 
    198 <A>if		{ ifsw = 1; return(IF); }
    199 <A>then		{ if (!ifsw) { yylval.i = THEN; return(ATTR); }
    200 		  yylval.p = delimstr("then part"); ifsw = 0;
    201 		  return(THENSTR); }
    202 <A>else		{ yylval.p = delimstr("else part"); return(ELSESTR); }
    203 
    204 <A>sh{WS}+	{ BEGIN sh;
    205 		  if ((delim = input()) == '{') delim = '}';	/* no nested {} */
    206 		  shell_init(); }
    207 <sh>{A}{B}*	{ struct symtab *p;
    208 		  if (yytext[0] == delim) {
    209 			shell_exec();
    210 			BEGIN A;
    211 		  } else {
    212 			p = lookup(yytext);
    213 			if (p != NULL && p->s_type == DEFNAME) {
    214 				c = input();
    215 				unput(c);
    216 				if (c == '(')
    217 					dodef(p);
    218 				else
    219 					pbstr(p->s_val.p);
    220 			} else
    221 				shell_text(yytext);
    222 		  }
    223 		}
    224 <sh>.|\n	{ if (yytext[0] == delim) {
    225 			shell_exec();
    226 			BEGIN A;
    227 		  } else
    228 			shell_text(yytext);
    229 		}
    230 
    231 <A>define{WS}+		{ BEGIN def; }
    232 <def>{A}{B}*		{ definition(yytext); BEGIN A; }
    233 <A>undef(ine)?{WS}+{A}{B}*	{ undefine(yytext); }
    234 
    235 <A>first		{ yylval.i = 1; return(NTH); }
    236 <A>{D}+(th|nd|rd|st)	{ yylval.i = atoi(yytext); return(NTH); }
    237 <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {
    238 		  	yylval.f = atof(yytext); return(NUMBER); }
    239 
    240 <A>{A}{B}* {	struct symtab *p;
    241 		p = lookup(yytext);
    242 		if (p != NULL && p->s_type == DEFNAME) {
    243 			c = input();
    244 			unput(c);
    245 			if (c == '(')	/* it's name(...) */
    246 				dodef(p);
    247 			else {	/* no argument list */
    248 				pbstr(p->s_val.p);
    249 				dprintf("pushing back `%s'\n", p->s_val.p);
    250 			}
    251 		} else if (islower((unsigned char)yytext[0])) {
    252 			yylval.p = tostring(yytext);
    253 			return(VARNAME);
    254 		} else {
    255 			yylval.p = tostring(yytext);
    256 			return(PLACENAME);
    257 		}
    258 	}
    259 
    260 <A>\"		{ BEGIN str; clen=0; }
    261 <str>\"		{ cbuf[clen]=0; yylval.p = tostring(cbuf); BEGIN A; return(TEXT); }
    262 <str>\n		{ cbuf[clen]=0; ERROR "missing quote in string \"%s\"", cbuf WARNING;
    263 				BEGIN A; return(ST); }
    264 <str>"\\\""	{ cbuf[clen++]='"'; }
    265 <str>"\\"t	{ cbuf[clen++]='\t'; }
    266 <str>"\\\\"	{ cbuf[clen++]='\\'; }
    267 <str>.		{ CADD; }
    268 
    269 <A>#.*		;
    270 
    271 <A>.		return(yylval.i = yytext[0]);
    272 
    273 %%