xref: /titanic_52/usr/src/cmd/oawk/awk.lx.l (revision 1cb6af97c6f66f456d4f726ef056e1ebc0f73305)
1 %{
2 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
3 %}
4 %{
5 /*	  All Rights Reserved  	*/
6 %}
7 %{
8 /*
9  * CDDL HEADER START
10  *
11  * The contents of this file are subject to the terms of the
12  * Common Development and Distribution License, Version 1.0 only
13  * (the "License").  You may not use this file except in compliance
14  * with the License.
15  *
16  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
17  * or http://www.opensolaris.org/os/licensing.
18  * See the License for the specific language governing permissions
19  * and limitations under the License.
20  *
21  * When distributing Covered Code, include this CDDL HEADER in each
22  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
23  * If applicable, add the following below this CDDL HEADER, with the
24  * fields enclosed by brackets "[]" replaced with your own identifying
25  * information: Portions Copyright [yyyy] [name of copyright owner]
26  *
27  * CDDL HEADER END
28  */
29 /* Copyright (c) 1996, by Sun Microsystems, Inc.                */
30 /* All rights reserved.                                         */
31 %}
32 
33 %{
34 #ident	"%Z%%M%	%I%	%E% SMI"
35 %}
36 
37 %Start A str chc sc reg comment
38 
39 %{
40 #include	"awk.h"
41 #include	"awk.def"
42 #undef	input	/* defeat lex */
43 extern int	yylval;
44 extern int	mustfld;
45 
46 long long	lineno	= 1;
47 #ifdef	DEBUG
48 #	define	RETURN(x)	{if (dbg) ptoken(x); return (x); }
49 #else
50 #	define	RETURN(x)	return (x)
51 #endif
52 #define	CADD	{ cbuf[clen++]=yytext[0]; if (clen>=CBUFLEN-1) { yyerror(\
53 		"string too long", cbuf); BEGIN A; } }
54 #define	CBUFLEN	150
55 wchar_t cbuf[CBUFLEN];
56 int	clen, cflag;
57 %}
58 
59 %a	50000
60 %o	50000
61 
62 A	[a-zA-Z_]
63 B	[a-zA-Z0-9_]
64 D	[0-9]
65 WS	[ \t]
66 
67 %%
68 	switch (yybgin-yysvec-1) {	/* witchcraft */
69 	case 0:
70 		BEGIN A;
71 		break;
72 	case sc:
73 		BEGIN A;
74 		RETURN('}');
75 	}
76 
77 <A>^\n		lineno++;
78 <A>^{WS}*#.*\n	lineno++;	/* strip comment lines */
79 <A>{WS}		/* dummy for cstyle */;
80 <A>"\\"\n	lineno++;
81 <reg>"\\"\n	lineno++;
82 <A>"||"		RETURN(BOR);
83 <A>BEGIN	RETURN(XBEGIN);
84 <A>END		RETURN(XEND);
85 <A>PROGEND	RETURN(EOF);
86 <A>"&&"		RETURN(AND);
87 <A>"!"		RETURN(NOT);
88 <A>"!="		{ yylval = NE; RETURN(RELOP); }
89 <A>"~"		{ yylval = MATCH; RETURN(MATCHOP); }
90 <A>"!~"		{ yylval = NOTMATCH; RETURN(MATCHOP); }
91 <A>"<"		{ yylval = LT; RETURN(RELOP); }
92 <A>"<="		{ yylval = LE; RETURN(RELOP); }
93 <A>"=="		{ yylval = EQ; RETURN(RELOP); }
94 <A>">="		{ yylval = GE; RETURN(RELOP); }
95 <A>">"		{ yylval = GT; RETURN(RELOP); }
96 <A>">>"		{ yylval = APPEND; RETURN(RELOP); }
97 <A>"++"		{ yylval = INCR; RETURN(INCR); }
98 <A>"--"		{ yylval = DECR; RETURN(DECR); }
99 <A>"+="		{ yylval = ADDEQ; RETURN(ASGNOP); }
100 <A>"-="		{ yylval = SUBEQ; RETURN(ASGNOP); }
101 <A>"*="		{ yylval = MULTEQ; RETURN(ASGNOP); }
102 <A>"/="		{ yylval = DIVEQ; RETURN(ASGNOP); }
103 <A>"%="		{ yylval = MODEQ; RETURN(ASGNOP); }
104 <A>"="		{ yylval = ASSIGN; RETURN(ASGNOP); }
105 
106 <A>"$"{D}+	{
107 		static wchar_t L_record[] = L"$record";
108 		if (watoi(yytext+1)==0) {
109 				yylval = (int)lookup(L_record, symtab, 0);
110 				RETURN(STRING);
111 			} else {
112 				yylval = fieldadr(watoi(yytext+1));
113 				RETURN(FIELD);
114 			}
115 		}
116 <A>"$"{WS}*	{ RETURN(INDIRECT); }
117 <A>NF		{ mustfld=1;
118 		yylval = (int)setsymtab(yytext, NULL, 0.0, NUM, symtab);
119 		RETURN(VAR); }
120 <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?	{
121 		yylval = (int)setsymtab(yytext, NULL, watof(yytext),
122 			CON|NUM, symtab); RETURN(NUMBER); }
123 <A>"}"{WS}*\n	{ BEGIN sc; lineno++; RETURN(';'); }
124 <A>"}"		{ BEGIN sc; RETURN(';'); }
125 <A>";"\n		{ lineno++; RETURN(';'); }
126 <A>\n		{ lineno++; RETURN(NL); }
127 <A>while	RETURN(WHILE);
128 <A>for		RETURN(FOR);
129 <A>if		RETURN(IF);
130 <A>else		RETURN(ELSE);
131 <A>next		RETURN(NEXT);
132 <A>exit		RETURN(EXIT);
133 <A>break	RETURN(BREAK);
134 <A>continue	RETURN(CONTINUE);
135 <A>print	{ yylval = PRINT; RETURN(PRINT); }
136 <A>printf	{ yylval = PRINTF; RETURN(PRINTF); }
137 <A>sprintf	{ yylval = SPRINTF; RETURN(SPRINTF); }
138 <A>split	{ yylval = SPLIT; RETURN(SPLIT); }
139 <A>substr	RETURN(SUBSTR);
140 <A>index	RETURN(INDEX);
141 <A>in		RETURN(IN);
142 <A>getline	RETURN(GETLINE);
143 <A>length	{ yylval = FLENGTH; RETURN(FNCN); }
144 <A>log		{ yylval = FLOG; RETURN(FNCN); }
145 <A>int		{ yylval = FINT; RETURN(FNCN); }
146 <A>exp		{ yylval = FEXP; RETURN(FNCN); }
147 <A>sqrt		{ yylval = FSQRT; RETURN(FNCN); }
148 <A>{A}{B}*	{
149 		static wchar_t L_0[] = { 0 };
150 		yylval = (int)setsymtab(yytext, tostring(L_0), 0.0, STR|NUM,
151 			symtab);
152 		RETURN(VAR);
153 		}
154 <A>\"		{ BEGIN str; clen=0; }
155 
156 <A>#		{ BEGIN comment; }
157 <comment>\n	{ BEGIN A; lineno++; RETURN(NL); }
158 <comment>.	/* dummy */;
159 
160 <A>.		{ yylval = yytext[0]; RETURN(yytext[0]); }
161 
162 <reg>"["	{ BEGIN chc; clen=0; cflag=0; }
163 <reg>"[^"	{ BEGIN chc; clen=0; cflag=1; }
164 
165 <reg>"?"	RETURN(QUEST);
166 <reg>"+"	RETURN(PLUS);
167 <reg>"*"	RETURN(STAR);
168 <reg>"|"	RETURN(OR);
169 <reg>"."	RETURN(DOT);
170 <reg>"("	RETURN('(');
171 <reg>")"	RETURN(')');
172 <reg>"^"	RETURN('^');
173 <reg>"$"	RETURN('$');
174 <reg>\\{D}{D}{D}	{ wsscanf(yytext+1, "%o", &yylval); RETURN(CHAR); }
175 <reg>\\.	{	if (yytext[1]=='n') yylval = '\n';
176 			else if (yytext[1] == 't') yylval = '\t';
177 			else if (yytext[1] == 'b') yylval = '\b';
178 			else if (yytext[1] == 'r') yylval = '\r';
179 			else if (yytext[1] == 'f') yylval = '\f';
180 			else yylval = yytext[1];
181 			RETURN(CHAR);
182 		}
183 <reg>"/"	{ BEGIN A; unput('/'); }
184 <reg>\n		{ yyerror("newline in regular expression"); lineno++; BEGIN A; }
185 <reg>.		{ yylval = yytext[0]; RETURN(CHAR); }
186 
187 <str>\"		{ wchar_t *s; BEGIN A; cbuf[clen]=0; s = tostring(cbuf);
188 		cbuf[clen] = ' '; cbuf[++clen] = 0;
189 		yylval = (int)setsymtab(cbuf, s, 0.0, CON|STR, symtab);
190 		RETURN(STRING); }
191 <str>\n		{ yyerror("newline in string"); lineno++; BEGIN A; }
192 <str>"\\\""	{ cbuf[clen++]='"'; }
193 <str>"\\"n	{ cbuf[clen++]='\n'; }
194 <chc>"\\"n	{ cbuf[clen++]='\n'; }
195 <str>"\\"t	{ cbuf[clen++]='\t'; }
196 <chc>"\\"t	{ cbuf[clen++]='\t'; }
197 <str>"\\"b	{ cbuf[clen++]='\b'; }
198 <chc>"\\"b	{ cbuf[clen++]='\b'; }
199 <str>"\\"r	{ cbuf[clen++]='\r'; }
200 <chc>"\\"r	{ cbuf[clen++]='\r'; }
201 <str>"\\"f 	{ cbuf[clen++]='\f'; }
202 <chc>"\\"f 	{ cbuf[clen++]='\f'; }
203 <str>"\\\\"	{ cbuf[clen++]='\\'; }
204 <chc>"\\\\"	{ cbuf[clen++]='\\'; }
205 <str>.		{ CADD; }
206 
207 <chc>"\\""]"	{ cbuf[clen++]=']'; }
208 <chc>"]"	{ BEGIN reg; cbuf[clen]=0; yylval = (int)tostring(cbuf);
209 		if (cflag==0) { RETURN(CCL); }
210 		else { RETURN(NCCL); } }
211 <chc>\n		{ yyerror("newline in character class"); lineno++; BEGIN A; }
212 <chc>.		{ CADD; }
213 
214 %%
215 
216 input()
217 {
218 	register c;
219 	extern wchar_t *lexprog;
220 
221 	if (yysptr > yysbuf)
222 		c = U(*--yysptr);
223 	else if (yyin == NULL)
224 		c = *lexprog++;
225 	else
226 		c = getwc(yyin);
227 	if (c == '\n')
228 		yylineno++;
229 	else if (c == EOF)
230 		c = 0;
231 	return (c);
232 }
233 
234 startreg()
235 {
236 	BEGIN reg;
237 }
238