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