fix pointer increment problems (from donn@utah-cs)
[unix-history] / usr / src / old / awk / awk.lx.l
CommitLineData
569c4905 1/* awk.lx.l 4.3 84/12/08 */
3df0917d
KM
2
3%Start A str chc sc reg comment
4
5%{
6#include "awk.h"
7#include "awk.def"
8#undef input /* defeat lex */
9extern int yylval;
10extern int mustfld;
569c4905 11extern int ldbg;
3df0917d
KM
12
13int lineno = 1;
569c4905 14#define RETURN(x) {if (ldbg) ptoken(x); return(x); }
3df0917d
KM
15#define CADD cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN A;}
16#define CBUFLEN 150
17char cbuf[CBUFLEN];
18int clen, cflag;
19%}
20
21A [a-zA-Z_]
22B [a-zA-Z0-9_]
23D [0-9]
24WS [ \t]
25
26%%
27 switch (yybgin-yysvec-1) { /* witchcraft */
28 case 0:
29 BEGIN A;
30 break;
31 case sc:
32 BEGIN A;
33 RETURN('}');
34 }
35
36<A>^\n lineno++;
37<A>^{WS}*#.*\n lineno++; /* strip comment lines */
38<A>{WS} ;
39<A,reg>"\\"\n lineno++;
40<A>"||" RETURN(BOR);
41<A>BEGIN RETURN(XBEGIN);
42<A>END RETURN(XEND);
43<A>PROGEND RETURN(EOF);
44<A>"&&" RETURN(AND);
45<A>"!" RETURN(NOT);
46<A>"!=" { yylval = NE; RETURN(RELOP); }
47<A>"~" { yylval = MATCH; RETURN(MATCHOP); }
48<A>"!~" { yylval = NOTMATCH; RETURN(MATCHOP); }
49<A>"<" { yylval = LT; RETURN(RELOP); }
50<A>"<=" { yylval = LE; RETURN(RELOP); }
51<A>"==" { yylval = EQ; RETURN(RELOP); }
52<A>">=" { yylval = GE; RETURN(RELOP); }
53<A>">" { yylval = GT; RETURN(RELOP); }
54<A>">>" { yylval = APPEND; RETURN(RELOP); }
55<A>"++" { yylval = INCR; RETURN(INCR); }
56<A>"--" { yylval = DECR; RETURN(DECR); }
57<A>"+=" { yylval = ADDEQ; RETURN(ASGNOP); }
58<A>"-=" { yylval = SUBEQ; RETURN(ASGNOP); }
59<A>"*=" { yylval = MULTEQ; RETURN(ASGNOP); }
60<A>"/=" { yylval = DIVEQ; RETURN(ASGNOP); }
61<A>"%=" { yylval = MODEQ; RETURN(ASGNOP); }
62<A>"=" { yylval = ASSIGN; RETURN(ASGNOP); }
63
64<A>"$"{D}+ { if (atoi(yytext+1)==0) {
65 yylval = (hack)lookup("$record", symtab, 0);
66 RETURN(STRING);
67 } else {
68 yylval = fieldadr(atoi(yytext+1));
69 RETURN(FIELD);
70 }
71 }
72<A>"$"{WS}* { RETURN(INDIRECT); }
c48090b0 73<A>NF { mustfld=1; yylval = (hack)setsymtab(yytext, EMPTY, 0.0, NUM, symtab); RETURN(VAR); }
3df0917d 74<A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)? {
c48090b0 75 yylval = (hack)setsymtab(yytext, EMPTY, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); }
3df0917d
KM
76<A>"}"{WS}*\n { BEGIN sc; lineno++; RETURN(';'); }
77<A>"}" { BEGIN sc; RETURN(';'); }
78<A>;\n { lineno++; RETURN(';'); }
79<A>\n { lineno++; RETURN(NL); }
80<A>while RETURN(WHILE);
81<A>for RETURN(FOR);
82<A>if RETURN(IF);
83<A>else RETURN(ELSE);
84<A>next RETURN(NEXT);
85<A>exit RETURN(EXIT);
86<A>break RETURN(BREAK);
87<A>continue RETURN(CONTINUE);
88<A>print { yylval = PRINT; RETURN(PRINT); }
89<A>printf { yylval = PRINTF; RETURN(PRINTF); }
90<A>sprintf { yylval = SPRINTF; RETURN(SPRINTF); }
91<A>split { yylval = SPLIT; RETURN(SPLIT); }
92<A>substr RETURN(SUBSTR);
93<A>index RETURN(INDEX);
94<A>in RETURN(IN);
95<A>getline RETURN(GETLINE);
96<A>length { yylval = FLENGTH; RETURN(FNCN); }
97<A>log { yylval = FLOG; RETURN(FNCN); }
98<A>int { yylval = FINT; RETURN(FNCN); }
99<A>exp { yylval = FEXP; RETURN(FNCN); }
100<A>sqrt { yylval = FSQRT; RETURN(FNCN); }
101<A>{A}{B}* { yylval = (hack)setsymtab(yytext, tostring(""), 0.0, STR|NUM, symtab); RETURN(VAR); }
102<A>\" { BEGIN str; clen=0; }
103
104<A># { BEGIN comment; }
105<comment>\n { BEGIN A; lineno++; RETURN(NL); }
106<comment>. ;
107
108<A>. { yylval = yytext[0]; RETURN(yytext[0]); }
109
110<reg>"[" { BEGIN chc; clen=0; cflag=0; }
111<reg>"[^" { BEGIN chc; clen=0; cflag=1; }
112
113<reg>"?" RETURN(QUEST);
114<reg>"+" RETURN(PLUS);
115<reg>"*" RETURN(STAR);
116<reg>"|" RETURN(OR);
117<reg>"." RETURN(DOT);
118<reg>"(" RETURN('(');
119<reg>")" RETURN(')');
120<reg>"^" RETURN('^');
121<reg>"$" RETURN('$');
122<reg>\\{D}{D}{D} { sscanf(yytext+1, "%o", &yylval); RETURN(CHAR); }
123<reg>\\. { if (yytext[1]=='n') yylval = '\n';
124 else if (yytext[1] == 't') yylval = '\t';
125 else yylval = yytext[1];
126 RETURN(CHAR);
127 }
128<reg>"/" { BEGIN A; unput('/'); }
129<reg>\n { yyerror("newline in regular expression"); lineno++; BEGIN A; }
130<reg>. { yylval = yytext[0]; RETURN(CHAR); }
131
132<str>\" { char *s; BEGIN A; cbuf[clen]=0; s = tostring(cbuf);
133 cbuf[clen] = ' '; cbuf[++clen] = 0;
134 yylval = (hack)setsymtab(cbuf, s, 0.0, CON|STR, symtab); RETURN(STRING); }
135<str>\n { yyerror("newline in string"); lineno++; BEGIN A; }
136<str>"\\\"" { cbuf[clen++]='"'; }
137<str,chc>"\\"n { cbuf[clen++]='\n'; }
138<str,chc>"\\"t { cbuf[clen++]='\t'; }
139<str,chc>"\\\\" { cbuf[clen++]='\\'; }
140<str>. { CADD; }
141
142<chc>"\\""]" { cbuf[clen++]=']'; }
143<chc>"]" { BEGIN reg; cbuf[clen]=0; yylval = (hack)tostring(cbuf);
144 if (cflag==0) { RETURN(CCL); }
145 else { RETURN(NCCL); } }
146<chc>\n { yyerror("newline in character class"); lineno++; BEGIN A; }
147<chc>. { CADD; }
148
149%%
150
151input()
152{
153 register c;
154 extern char *lexprog;
155
156 if (yysptr > yysbuf)
157 c = U(*--yysptr);
158 else if (yyin == NULL)
159 c = *lexprog++;
160 else
161 c = getc(yyin);
162 if (c == '\n')
163 yylineno++;
164 else if (c == EOF)
165 c = 0;
166 return(c);
167}
168
169startreg()
170{
171 BEGIN reg;
172}
569c4905
SL
173
174ptoken(n)
175{
176 extern struct tok {
177 char *tnm;
178 int yval;
179 } tok[];
180 extern char yytext[];
181 extern int yylval;
182
183 printf("lex:");
184 if (n < 128) {
185 printf(" %c\n",n);
186 return;
187 }
188 if (n <= 256 || n >= LASTTOKEN) {
189 printf("? %o\n",n);
190 return;
191 }
192 printf(" %s",tok[n-257].tnm);
193 switch (n) {
194
195 case RELOP:
196 case MATCHOP:
197 case ASGNOP:
198 case STRING:
199 case FIELD:
200 case VAR:
201 case NUMBER:
202 case FNCN:
203 printf(" (%s)", yytext);
204 break;
205
206 case CHAR:
207 printf(" (%o)", yylval);
208 break;
209 }
210 putchar('\n');
211}