xref: /NextBSD/usr.bin/migcom/lexxer.l (revision fb401d0183bb3b94a85947e6ddeeb69dfcbc8fc6)
1 %k 10000
2 %n 5000
3 %a 20000
4 %e 10000
5 %p 25000
6 
7 Ident		([A-Za-z_][A-Za-z_0-9]*)
8 Number		([0-9]+)
9 String		([-/._$A-Za-z0-9]+)
10 QString		(\"[^"\n]*\")
11 AString		(\<[^>\n]*\>)
12 FileName	({QString}|{AString})
13 
14 %{
15 /*
16  * Copyright 1991-1998 by Open Software Foundation, Inc.
17  *              All Rights Reserved
18  *
19  * Permission to use, copy, modify, and distribute this software and
20  * its documentation for any purpose and without fee is hereby granted,
21  * provided that the above copyright notice appears in all copies and
22  * that both the copyright notice and this permission notice appear in
23  * supporting documentation.
24  *
25  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
26  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE.
28  *
29  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
30  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
31  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
32  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
33  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
34  */
35 /*
36  * cmk1.1
37  */
38 /*
39  * Mach Operating System
40  * Copyright (c) 1991,1990 Carnegie Mellon University
41  * All Rights Reserved.
42  *
43  * Permission to use, copy, modify and distribute this software and its
44  * documentation is hereby granted, provided that both the copyright
45  * notice and this permission notice appear in all copies of the
46  * software, derivative works or modified versions, and any portions
47  * thereof, and that both notices appear in supporting documentation.
48  *
49  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
50  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
51  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
52  *
53  * Carnegie Mellon requests users of this software to return to
54  *
55  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
56  *  School of Computer Science
57  *  Carnegie Mellon University
58  *  Pittsburgh PA 15213-3890
59  *
60  * any improvements or extensions that they make and grant Carnegie Mellon
61  * the rights to redistribute these changes.
62  */
63 /*
64  * 92/03/03  16:25:00  jeffreyh
65  * 	Changes from TRUNK
66  * 	[92/02/26  12:31:19  jeffreyh]
67  *
68  * 92/01/23  15:21:24  rpd
69  * 	Fixed macros for STDC.
70  * 	[92/01/16            rpd]
71  *
72  * 92/01/03  20:29:25  dbg
73  * 	Add 'CountInOut' flag.
74  * 	[91/11/11            dbg]
75  *
76  * 91/08/28  11:17:01  jsb
77  * 	Added syServerDemux.
78  * 	[91/08/13            rpd]
79  *
80  * 	Removed syMsgKind, syCamelot, syCamelotRoutine, syTrapRoutine,
81  * 	syTrapSimpleRoutine.  Added syMsgSeqno.
82  * 	[91/08/11            rpd]
83  *
84  * 91/07/31  18:09:31  dbg
85  * 	Add 'serverCopy' keyword.
86  * 	[91/06/05            dbg]
87  *
88  * 	Add 'c_string' keyword.
89  * 	[91/04/03            dbg]
90  *
91  * 91/02/05  17:54:51  mrt
92  * 	Changed to new Mach copyright
93  * 	[91/02/01  17:54:35  mrt]
94  *
95  * 90/06/02  15:04:54  rpd
96  * 	Created for new IPC.
97  * 	[90/03/26  21:11:34  rpd]
98  *
99  * 07-Apr-89  Richard Draves (rpd) at Carnegie-Mellon University
100  *	Extensive revamping.  Added polymorphic arguments.
101  *	Allow multiple variable-sized inline arguments in messages.
102  *
103  * 27-May-87  Richard Draves (rpd) at Carnegie-Mellon University
104  *	Created.
105  */
106 
107 #include <sys/types.h>
108 #include <mach/message.h>
109 #include <mach/std_types.h>
110 #include "strdefs.h"
111 #include "type.h"
112 #include "error.h"
113 #include "statement.h"
114 #include "global.h"
115 #include "parser.h"
116 #include "lexxer.h"
117 #include "mig_machine.h"
118 
119 #pragma clang diagnostic ignored "-Wunneeded-internal-declaration"
120 #undef yywrap
121 #define yywrap() 1
122 #define	PortSize	(sizeof (mach_port_t) * NBBY)
123 #ifdef	__STDC__
124 #define stringize(x)	#x
125 #else	/* __STDC__ */
126 #define	stringize(x)	"x"
127 #endif	/* __STDC__ */
128 
129 #ifdef	LDEBUG
130 #define RETURN(sym)							\
131 {									\
132     printf("yylex: returning '%s' (%d)\n", stringize(sym), (sym));	\
133     return (sym);							\
134 }
135 #else	/* LDEBUG */
136 #define RETURN(sym)	return (sym)
137 #endif	/* LDEBUG */
138 
139 #define	TPRETURN(intype, outtype, tsize)				\
140 {									\
141     yylval.symtype.innumber = (intype);					\
142     yylval.symtype.instr = stringize(intype);				\
143     yylval.symtype.outnumber = (outtype);				\
144     yylval.symtype.outstr = stringize(outtype);				\
145     yylval.symtype.size = (tsize);					\
146     RETURN(sySymbolicType);						\
147 }
148 
149 #define	TRETURN(type, tsize)	TPRETURN(type,type,tsize)
150 
151 #define SAVE(s)		do {oldYYBegin = s; BEGIN s; } while (0)
152 
153 #define RESTORE		BEGIN oldYYBegin
154 
155 #define	FRETURN(val)							\
156 {									\
157     yylval.flag = (val);						\
158     RETURN(syIPCFlag);							\
159 }
160 
161 static int	oldYYBegin = 0;
162 
163 int lineno = 0;			/* Replaces lex yylineno */
164 
165 static void doSharp(); /* process body of # directives */
166 extern void yyerror(const char *);
167 %}
168 
169 %option noyywrap
170 
171 %Start	Normal String FileName QString SkipToEOL
172 
173 %%
174 
175 <Normal>[Rr][Oo][Uu][Tt][Ii][Nn][Ee]		RETURN(syRoutine);
176 <Normal>[Ss][Ii][Mm][Pp][Ll][Ee][Rr][Oo][Uu][Tt][Ii][Nn][Ee] RETURN(sySimpleRoutine);
177 <Normal>[Ss][Uu][Bb][Ss][Yy][Ss][Tt][Ee][Mm]	RETURN(sySubsystem);
178 <Normal>[Mm][Ss][Gg][Oo][Pp][Tt][Ii][Oo][Nn]	RETURN(syMsgOption);
179 <Normal>[Mm][Ss][Gg][Ss][Ee][Qq][Nn][Oo]	RETURN(syMsgSeqno);
180 <Normal>[Ww][Aa][Ii][Tt][Tt][Ii][Mm][Ee]	RETURN(syWaitTime);
181 <Normal>[Nn][Oo][Ww][Aa][Ii][Tt][Tt][Ii][Mm][Ee]	RETURN(syNoWaitTime);
182 <Normal>[Ss][Ee][Nn][Dd][Tt][Ii][Mm][Ee]	RETURN(sySendTime);
183 <Normal>[Nn][Oo][Ss][Ee][Nn][Dd][Tt][Ii][Mm][Ee]	RETURN(syNoSendTime);
184 <Normal>[Ii][Nn]				RETURN(syIn);
185 <Normal>[Oo][Uu][Tt]				RETURN(syOut);
186 <Normal>[Uu][Ss][Ee][Rr][Ii][Mm][Pp][Ll]		RETURN(syUserImpl);
187 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Ii][Mm][Pp][Ll]	RETURN(syServerImpl);
188 <Normal>[Ss][Ee][Cc][Tt][Oo][Kk][Ee][Nn]	RETURN(sySecToken);
189 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Ss][Ee][Cc][Tt][Oo][Kk][Ee][Nn] RETURN(syServerSecToken);
190 <Normal>[Uu][Ss][Ee][Rr][Ss][Ee][Cc][Tt][Oo][Kk][Ee][Nn]	RETURN(syUserSecToken);
191 <Normal>[Aa][Uu][Dd][Ii][Tt][Tt][Oo][Kk][Ee][Nn]	RETURN(syAuditToken);
192 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Aa][Uu][Dd][Ii][Tt][Tt][Oo][Kk][Ee][Nn] RETURN(syServerAuditToken);
193 <Normal>[Uu][Ss][Ee][Rr][Aa][Uu][Dd][Ii][Tt][Tt][Oo][Kk][Ee][Nn]	RETURN(syUserAuditToken);
194 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Cc][Oo][Nn][Tt][Ee][Xx][Tt][Tt][Oo][Kk][Ee][Nn]	RETURN(syServerContextToken);
195 <Normal>[Ii][Nn][Oo][Uu][Tt]			RETURN(syInOut);
196 <Normal>[Rr][Ee][Qq][Uu][Ee][Ss][Tt][Pp][Oo][Rr][Tt]	RETURN(syRequestPort);
197 <Normal>[Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt]		RETURN(syReplyPort);
198 <Normal>[Uu][Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt]	RETURN(syUReplyPort);
199 <Normal>[Ss][Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt]	RETURN(sySReplyPort);
200 <Normal>[Aa][Rr][Rr][Aa][Yy]			RETURN(syArray);
201 <Normal>[Oo][Ff]				RETURN(syOf);
202 <Normal>[Ee][Rr][Rr][Oo][Rr]			RETURN(syErrorProc);
203 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Pp][Rr][Ee][Ff][Ii][Xx] RETURN(syServerPrefix);
204 <Normal>[Uu][Ss][Ee][Rr][Pp][Rr][Ee][Ff][Ii][Xx]	RETURN(syUserPrefix);
205 <Normal>[Ss][Ee][Rr][Vv][Ee][Rr][Dd][Ee][Mm][Uu][Xx]	RETURN(syServerDemux);
206 <Normal>[Rr][Cc][Ss][Ii][Dd]			RETURN(syRCSId);
207 <Normal>[Ii][Mm][Pp][Oo][Rr][Tt]		RETURN(syImport);
208 <Normal>[Uu][Ii][Mm][Pp][Oo][Rr][Tt]		RETURN(syUImport);
209 <Normal>[Ss][Ii][Mm][Pp][Oo][Rr][Tt]		RETURN(sySImport);
210 <Normal>[Dd][Ii][Mm][Pp][Oo][Rr][Tt]		RETURN(syDImport);
211 <Normal>[Ii][Ii][Mm][Pp][Oo][Rr][Tt]		RETURN(syIImport);
212 <Normal>[Tt][Yy][Pp][Ee]			RETURN(syType);
213 <Normal>[Kk][Ee][Rr][Nn][Ee][Ll][Ss][Ee][Rr][Vv][Ee][Rr] RETURN(syKernelServer);
214 <Normal>[Kk][Ee][Rr][Nn][Ee][Ll][Uu][Ss][Ee][Rr]	RETURN(syKernelUser);
215 <Normal>[Ss][Kk][Ii][Pp]			RETURN(sySkip);
216 <Normal>[Ss][Tt][Rr][Uu][Cc][Tt]		RETURN(syStruct);
217 <Normal>[Ii][Nn][Tt][Rr][Aa][Nn]		RETURN(syInTran);
218 <Normal>[Oo][Uu][Tt][Tt][Rr][Aa][Nn]		RETURN(syOutTran);
219 <Normal>[Dd][Ee][Ss][Tt][Rr][Uu][Cc][Tt][Oo][Rr]	RETURN(syDestructor);
220 <Normal>[Cc][Tt][Yy][Pp][Ee]				RETURN(syCType);
221 <Normal>[Cc][Uu][Ss][Ee][Rr][Tt][Yy][Pp][Ee]		RETURN(syCUserType);
222 <Normal>[Cc][Ss][Ee][Rr][Vv][Ee][Rr][Tt][Yy][Pp][Ee]	RETURN(syCServerType);
223 <Normal>[Cc]_[Ss][Tt][Rr][Ii][Nn][Gg]			RETURN(syCString);
224 
225 <Normal>[Ss][Aa][Mm][Ee][Cc][Oo][Uu][Nn][Tt] 		FRETURN(flSameCount);
226 <Normal>[Rr][Ee][Tt][Cc][Oo][Dd][Ee] 			FRETURN(flRetCode);
227 <Normal>[Pp][Hh][Yy][Ss][Ii][Cc][Aa][Ll][Cc][Oo][Pp][Yy] FRETURN(flPhysicalCopy);
228 <Normal>[Oo][Vv][Ee][Rr][Ww][Rr][Ii][Tt][Ee]	FRETURN(flOverwrite);
229 <Normal>[Dd][Ee][Aa][Ll][Ll][Oo][Cc]		FRETURN(flDealloc);
230 <Normal>[Nn][Oo][Tt][Dd][Ee][Aa][Ll][Ll][Oo][Cc] FRETURN(flNotDealloc);
231 <Normal>[Cc][Oo][Uu][Nn][Tt][Ii][Nn][Oo][Uu][Tt] FRETURN(flCountInOut);
232 <Normal>[Pp][Oo][Ll][Yy][Mm][Oo][Rr][Pp][Hh][Ii][Cc]	TPRETURN(MACH_MSG_TYPE_POLYMORPHIC, MACH_MSG_TYPE_POLYMORPHIC, PortSize);
233 <Normal>[Aa][Uu][Tt][Oo]			FRETURN(flAuto);
234 <Normal>[Cc][Oo][Nn][Ss][Tt]			FRETURN(flConst);
235 <Normal>"PointerTo"				RETURN(syPointerTo);
236 <Normal>"PointerToIfNot"		      	RETURN(syPointerToIfNot);
237 <Normal>"ValueOf"				RETURN(syValueOf);
238 <Normal>"UserTypeLimit"				RETURN(syUserTypeLimit);
239 <Normal>"OnStackLimit"                          RETURN(syOnStackLimit);
240 
241 
242 <Normal>"MACH_MSG_TYPE_UNSTRUCTURED"	TRETURN(MACH_MSG_TYPE_UNSTRUCTURED,0);
243 <Normal>"MACH_MSG_TYPE_BIT"		TRETURN(MACH_MSG_TYPE_BIT,1);
244 <Normal>"MACH_MSG_TYPE_BOOLEAN"		TRETURN(MACH_MSG_TYPE_BOOLEAN,32);
245 <Normal>"MACH_MSG_TYPE_INTEGER_8"	TRETURN(MACH_MSG_TYPE_INTEGER_8,8);
246 <Normal>"MACH_MSG_TYPE_INTEGER_16"	TRETURN(MACH_MSG_TYPE_INTEGER_16,16);
247 <Normal>"MACH_MSG_TYPE_INTEGER_32"	TRETURN(MACH_MSG_TYPE_INTEGER_32,32);
248 <Normal>"MACH_MSG_TYPE_INTEGER_64"	TRETURN(MACH_MSG_TYPE_INTEGER_64,64);
249 <Normal>"MACH_MSG_TYPE_REAL_32"		TRETURN(MACH_MSG_TYPE_REAL_32,32);
250 <Normal>"MACH_MSG_TYPE_REAL_64"		TRETURN(MACH_MSG_TYPE_REAL_64,64);
251 <Normal>"MACH_MSG_TYPE_CHAR"		TRETURN(MACH_MSG_TYPE_CHAR,8);
252 <Normal>"MACH_MSG_TYPE_BYTE"		TRETURN(MACH_MSG_TYPE_BYTE,8);
253 
254 <Normal>"MACH_MSG_TYPE_MOVE_RECEIVE"	TPRETURN(MACH_MSG_TYPE_MOVE_RECEIVE,MACH_MSG_TYPE_PORT_RECEIVE,PortSize);
255 <Normal>"MACH_MSG_TYPE_COPY_SEND"	TPRETURN(MACH_MSG_TYPE_COPY_SEND,MACH_MSG_TYPE_PORT_SEND,PortSize);
256 <Normal>"MACH_MSG_TYPE_MAKE_SEND"	TPRETURN(MACH_MSG_TYPE_MAKE_SEND,MACH_MSG_TYPE_PORT_SEND,PortSize);
257 <Normal>"MACH_MSG_TYPE_MOVE_SEND"	TPRETURN(MACH_MSG_TYPE_MOVE_SEND,MACH_MSG_TYPE_PORT_SEND,PortSize);
258 <Normal>"MACH_MSG_TYPE_MAKE_SEND_ONCE"	TPRETURN(MACH_MSG_TYPE_MAKE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,PortSize);
259 <Normal>"MACH_MSG_TYPE_MOVE_SEND_ONCE"	TPRETURN(MACH_MSG_TYPE_MOVE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,PortSize);
260 
261 <Normal>"MACH_MSG_TYPE_PORT_NAME"	TRETURN(MACH_MSG_TYPE_PORT_NAME,PortSize);
262 <Normal>"MACH_MSG_TYPE_PORT_RECEIVE"	TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_RECEIVE,PortSize);
263 <Normal>"MACH_MSG_TYPE_PORT_SEND"	TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND,PortSize);
264 <Normal>"MACH_MSG_TYPE_PORT_SEND_ONCE"	TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND_ONCE,PortSize);
265 <Normal>"MACH_MSG_TYPE_POLYMORPHIC"	TPRETURN(MACH_MSG_TYPE_POLYMORPHIC, MACH_MSG_TYPE_POLYMORPHIC, PortSize);
266 
267 <Normal>":"		RETURN(syColon);
268 <Normal>";"		RETURN(sySemi);
269 <Normal>","		RETURN(syComma);
270 <Normal>"+"		RETURN(syPlus);
271 <Normal>"-"		RETURN(syMinus);
272 <Normal>"*"		RETURN(syStar);
273 <Normal>"/"		RETURN(syDiv);
274 <Normal>"("		RETURN(syLParen);
275 <Normal>")"		RETURN(syRParen);
276 <Normal>"="		RETURN(syEqual);
277 <Normal>"^"		RETURN(syCaret);
278 <Normal>"~"		RETURN(syTilde);
279 <Normal>"<"		RETURN(syLAngle);
280 <Normal>">"		RETURN(syRAngle);
281 <Normal>"["		RETURN(syLBrack);
282 <Normal>"]"		RETURN(syRBrack);
283 <Normal>"|"		RETURN(syBar);
284 
285 <Normal>{Ident}		{ yylval.identifier = strmake(yytext);
286 			  RETURN(syIdentifier); }
287 <Normal>{Number}	{ yylval.number = atoi(yytext); RETURN(syNumber); }
288 
289 <String>{String}	{ yylval.string = strmake(yytext);
290 			  SAVE(Normal); RETURN(syString); }
291 <FileName>{FileName}	{ yylval.string = strmake(yytext);
292 			  SAVE(Normal); RETURN(syFileName); }
293 <QString>{QString}	{ yylval.string = strmake(yytext);
294 			  SAVE(Normal); RETURN(syQString); }
295 
296 ^\#[ \t]*{Number}[ \t]*\"[^"]*\"	{ doSharp(yytext+1);
297 					  BEGIN SkipToEOL; }
298 ^\#\ *{Number}				{ doSharp(yytext+1);
299 					  BEGIN SkipToEOL; }
300 ^\#					{ yyerror("illegal # directive");
301 					  BEGIN SkipToEOL; }
302 ^\#pragma			{ BEGIN SkipToEOL; }
303 <SkipToEOL>\n		{ RESTORE; lineno++; }
304 <SkipToEOL>.		;
305 
306 [ \t]			;
307 \n			lineno++;
308 .			{ SAVE(Normal); RETURN(syError); }
309 
310 %%
311 
312 extern void
313 LookNormal(void)
314 {
315     SAVE(Normal);
316 }
317 
318 extern void
319 LookString(void)
320 {
321     SAVE(String);
322 }
323 
324 extern void
325 LookQString()
326 {
327     SAVE(QString);
328 }
329 
330 extern void
331 LookFileName()
332 {
333     SAVE(FileName);
334 }
335 
336 static void
337 doSharp(body)
338     char *body;
339 {
340     register char *startName, *endName;
341 
342     lineno = atoi(body);
343     startName = strchr(body, '"');
344     if (startName != NULL)
345     {
346 	endName = strrchr(body, '"');
347 	*endName = '\0';
348 	strfree(__DECONST(char *,yyinname));
349 	yyinname = strmake(startName+1);
350     }
351 }
352 
353