devutf: add unicode aliases for accented characters
[troff.git] / pic / picl.lx
blobdbe2a3d5c86c3a18b1c66c9383ec360a630d7a22
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
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"
18 extern  char    *filename;
19 extern  struct  symtab  symtab[];
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);
27 int     yyback(int *, int);
28 int     yylook(void);
29 int     yywrap(void);
31 #define CADD    cbuf[clen++]=yytext[0]; \
32                 if (clen>=CBUFLEN-1) { ERROR "string too long", cbuf 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 */
39 A       [a-zA-Z_]
40 B       [a-zA-Z0-9_]
41 D       [0-9]
42 WS      [ \t]
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         }
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]); }
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); }
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);
86 <A>same         return(SAME);
87 <A>between      return(BETWEEN);
88 <A>and          return(AND);
90 <A>of           ;
91 <A>the          ;
92 <A>way          ;
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); }
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); }
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         return(yylval.i = FILL);
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);
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; }
149 <A>"<-"         { yylval.i = HEAD1; return(HEAD); }
150 <A>"->"         { yylval.i = HEAD2; return(HEAD); }
151 <A>"<->"        { yylval.i = HEAD12; return(HEAD); }
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);
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);
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);
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);    
187 <A>Here         return(yylval.i = HERE);
189 <A>for          return(FOR);
190 <A>^Endfor\n    { endfor(); }
191 <A>do           { yylval.p = delimstr("loop body"); return(DOSTR); }
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);
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); }
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                 }
231 <A>define{WS}+          { BEGIN def; }
232 <def>{A}{B}*            { definition(yytext); BEGIN A; }
233 <A>undef(ine)?{WS}+{A}{B}*      { undefine(yytext); }
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); }
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(yytext[0])) {
252                         yylval.p = tostring(yytext);
253                         return(VARNAME);
254                 } else {
255                         yylval.p = tostring(yytext);
256                         return(PLACENAME);
257                 }
258         }
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; }
269 <A>#.*          ;
271 <A>.            return(yylval.i = yytext[0]);