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