%option nounput %option noyywrap %k 10000 %n 5000 %a 20000 %e 10000 %p 25000 Ident ([A-Za-z_][A-Za-z_0-9]*) Number ([0-9]+) String ([-/._$A-Za-z0-9]+) QString (\"[^"\n]*\") AString (\<[^>\n]*\>) FileName ({QString}|{AString}) %{ /* * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ #include #include "mig_string.h" #include "type.h" #include "statement.h" #include "global.h" #include "parser.h" #include "lexxer.h" #include "cpu.h" /* We do not need the input function. */ #define YY_NO_INPUT #ifdef LDEBUG #define RETURN(sym) \ { \ printf("yylex: returning '%s' (%d)\n", #sym, (sym)); \ return (sym); \ } #else /* LDEBUG */ #define RETURN(sym) return (sym) #endif /* LDEBUG */ #define TPRETURN(intype, outtype, tsize) \ { \ yylval.symtype.innumber = (intype); \ yylval.symtype.instr = #intype; \ yylval.symtype.outnumber = (outtype); \ yylval.symtype.outstr = #outtype; \ yylval.symtype.size = (tsize); \ RETURN(sySymbolicType); \ } #define TRETURN(type, tsize) \ { \ yylval.symtype.innumber = (type); \ yylval.symtype.instr = #type; \ yylval.symtype.outnumber = (type); \ yylval.symtype.outstr = #type; \ yylval.symtype.size = (tsize); \ RETURN(sySymbolicType); \ } #define FRETURN(val) \ { \ yylval.flag = (val); \ RETURN(syIPCFlag); \ } extern YYSTYPE yylval; /* added by rm */ extern void yyerror(const char *); int lineno; char *inname; #ifdef YY_START static int oldYYBegin; #define SAVE_BEGIN oldYYBegin = YY_START #define RSTR_BEGIN BEGIN oldYYBegin #else static struct yysvf *oldYYBegin; #define SAVE_BEGIN oldYYBegin = yybgin #define RSTR_BEGIN yybgin = oldYYBegin; #endif static void doSharp(const char *body); /* process body of # directives */ %} %Start Normal String FileName QString SkipToEOL %% (?i:routine) RETURN(syRoutine); (?i:simpleroutine) RETURN(sySimpleRoutine); (?i:subsystem) RETURN(sySubsystem); (?i:msgoption) RETURN(syMsgOption); (?i:msgseqno) RETURN(syMsgSeqno); (?i:waittime) RETURN(syWaitTime); (?i:nowaittime) RETURN(syNoWaitTime); (?i:in) RETURN(syIn); (?i:out) RETURN(syOut); (?i:inout) RETURN(syInOut); (?i:requestport) RETURN(syRequestPort); (?i:replyport) RETURN(syReplyPort); (?i:ureplyport) RETURN(syUReplyPort); (?i:sreplyport) RETURN(sySReplyPort); (?i:array) RETURN(syArray); (?i:of) RETURN(syOf); (?i:error) RETURN(syErrorProc); (?i:serverprefix) RETURN(syServerPrefix); (?i:userprefix) RETURN(syUserPrefix); (?i:serverdemux) RETURN(syServerDemux); (?i:rcsid) RETURN(syRCSId); (?i:import) RETURN(syImport); (?i:uimport) RETURN(syUImport); (?i:simport) RETURN(sySImport); (?i:type) RETURN(syType); (?i:kernelserver) RETURN(syKernelServer); (?i:kerneluser) RETURN(syKernelUser); (?i:skip) RETURN(sySkip); (?i:struct) RETURN(syStruct); (?i:intran) RETURN(syInTran); (?i:intranpayload) RETURN(syInTranPayload); (?i:outtran) RETURN(syOutTran); (?i:destructor) RETURN(syDestructor); (?i:ctype) RETURN(syCType); (?i:cusertype) RETURN(syCUserType); (?i:cservertype) RETURN(syCServerType); (?i:c_string) RETURN(syCString); (?i:islong) FRETURN(flLong); (?i:isnotlong) FRETURN(flNotLong); (?i:dealloc) FRETURN(flDealloc); (?i:notdealloc) FRETURN(flNotDealloc); (?i:servercopy) FRETURN(flServerCopy); (?i:countinout) FRETURN(flCountInOut); (?i:retcode) FRETURN(flNone); (?i:polymorphic) TRETURN(MACH_MSG_TYPE_POLYMORPHIC,port_size_in_bits); "MACH_MSG_TYPE_UNSTRUCTURED" TRETURN(MACH_MSG_TYPE_UNSTRUCTURED,0); "MACH_MSG_TYPE_BIT" TRETURN(MACH_MSG_TYPE_BIT,1); "MACH_MSG_TYPE_BOOLEAN" TRETURN(MACH_MSG_TYPE_BOOLEAN,32); "MACH_MSG_TYPE_INTEGER_16" TRETURN(MACH_MSG_TYPE_INTEGER_16,16); "MACH_MSG_TYPE_INTEGER_32" TRETURN(MACH_MSG_TYPE_INTEGER_32,32); "MACH_MSG_TYPE_INTEGER_64" TRETURN(MACH_MSG_TYPE_INTEGER_64,64); "MACH_MSG_TYPE_CHAR" TRETURN(MACH_MSG_TYPE_CHAR,8); "MACH_MSG_TYPE_BYTE" TRETURN(MACH_MSG_TYPE_BYTE,8); "MACH_MSG_TYPE_INTEGER_8" TRETURN(MACH_MSG_TYPE_INTEGER_8,8); "MACH_MSG_TYPE_REAL" TRETURN(MACH_MSG_TYPE_REAL,0); "MACH_MSG_TYPE_STRING" TRETURN(MACH_MSG_TYPE_STRING,0); "MACH_MSG_TYPE_STRING_C" TRETURN(MACH_MSG_TYPE_STRING_C,0); "MACH_MSG_TYPE_MOVE_RECEIVE" TPRETURN(MACH_MSG_TYPE_MOVE_RECEIVE,MACH_MSG_TYPE_PORT_RECEIVE,port_size_in_bits); "MACH_MSG_TYPE_COPY_SEND" TPRETURN(MACH_MSG_TYPE_COPY_SEND,MACH_MSG_TYPE_PORT_SEND,port_size_in_bits); "MACH_MSG_TYPE_MAKE_SEND" TPRETURN(MACH_MSG_TYPE_MAKE_SEND,MACH_MSG_TYPE_PORT_SEND,port_size_in_bits); "MACH_MSG_TYPE_MOVE_SEND" TPRETURN(MACH_MSG_TYPE_MOVE_SEND,MACH_MSG_TYPE_PORT_SEND,port_size_in_bits); "MACH_MSG_TYPE_MAKE_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_MAKE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,port_size_in_bits); "MACH_MSG_TYPE_MOVE_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_MOVE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,port_size_in_bits); "MACH_MSG_TYPE_PORT_NAME" TRETURN(MACH_MSG_TYPE_PORT_NAME,port_name_size_in_bits); "MACH_MSG_TYPE_PORT_RECEIVE" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_RECEIVE,port_size_in_bits); "MACH_MSG_TYPE_PORT_SEND" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND,port_size_in_bits); "MACH_MSG_TYPE_PORT_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND_ONCE,port_size_in_bits); "MACH_MSG_TYPE_POLYMORPHIC" TRETURN(MACH_MSG_TYPE_POLYMORPHIC,0); ":" RETURN(syColon); ";" RETURN(sySemi); "," RETURN(syComma); "+" RETURN(syPlus); "-" RETURN(syMinus); "*" RETURN(syStar); "/" RETURN(syDiv); "(" RETURN(syLParen); ")" RETURN(syRParen); "=" RETURN(syEqual); "^" RETURN(syCaret); "~" RETURN(syTilde); "<" RETURN(syLAngle); ">" RETURN(syRAngle); "[" RETURN(syLBrack); "]" RETURN(syRBrack); "|" RETURN(syBar); {Ident} { yylval.identifier = strmake(yytext); RETURN(syIdentifier); } {Number} { yylval.number = atoi(yytext); RETURN(syNumber); } {String} { yylval.string = strmake(yytext); BEGIN Normal; RETURN(syString); } {FileName} { yylval.string = strmake(yytext); BEGIN Normal; RETURN(syFileName); } {QString} { yylval.string = strmake(yytext); BEGIN Normal; RETURN(syQString); } ^\#[ \t]*{Number}[ \t]*\"[^"]*\" { doSharp(yytext+1); SAVE_BEGIN; BEGIN SkipToEOL; } ^\#\ *{Number} { doSharp(yytext+1); SAVE_BEGIN; BEGIN SkipToEOL; } ^\#define[ \t] { /* GCC's pre-processor might emit those. */ SAVE_BEGIN; BEGIN SkipToEOL; } ^\# { yyerror("illegal # directive"); SAVE_BEGIN; BEGIN SkipToEOL; } \n RSTR_BEGIN; . ; [ \t] ; \n { lineno++; } . { BEGIN Normal; RETURN(syError); } %% extern void LookNormal(void) { if (inname == 0) { inname = strmake("(unknown)"); lineno = 0; } BEGIN Normal; } extern void LookString(void) { BEGIN String; } extern void LookQString(void) { BEGIN QString; } extern void LookFileName(void) { BEGIN FileName; } static void doSharp(const char *body) { const char *startName; lineno = atoi(body); startName = strchr(body, '"'); if (startName != NULL) { *strrchr(body, '"') = '\0'; strfree(inname); inname = strmake(startName+1); } }