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