%{ /* This file is used to generate the lexical analysis for etags. */ int level = 0; extern char lastcaller[]; long yycharno = 0; int complex_define = 0; /*That is, define's with more than one line*/ /* Make sure that input macros keep track of character position. */ /* Also, use the current input file inf instead of yyin (standard input) */ #undef input # define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(inf))==10?(yylineno++,yytchar):yytchar)==EOF?0:(yycharno++,yytchar)) #undef unput # define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;yycharno--;} /* yytext is too short for long comments such as those generated by RCS */ #undef YYLMAX #define YYLMAX 4096 #define YYEOF 0 typedef struct { char *name; int line; long charpos; } save_ident; int sp = 0; #define StackSize 100 save_ident *Stack[StackSize]; push(stack_value) save_ident * stack_value; { if (sp < StackSize) Stack[sp++] = stack_value; else printf ("Stack overflow\n"); } save_ident * pop () { if (sp > 0) return (Stack[--sp]); else printf ("Stack underflow\n"); } save_ident * funcid; extern FILE *inf; extern char * savestr(); extern int xmalloc(); %} %p 3072 /* regular expressions */ delim [ \t\n] ws {delim}+ letter [A-Za-z_] digit [0-9] funcid ~?{letter}({letter}|{digit})* funcid2 {funcid}\:\:{funcid} EXP ([eE][+-]?[0-9]+) FS [flFL] IS ([uU][lL]?|[lL][uU]?) number1 ([0-9]+"."[0-9]*{EXP}?{FS}?) number2 ("."[0-9]+{EXP}?{FS}?) number3 ([0-9]+({EXP})?({FS})?) number4 ([1-9][0-9]*{IS}?) number5 (0[0-7]*{IS}?) number6 (0[xX][0-9a-fA-F]+{IS}?) macdef (\#define[^\n]*\/\*)|(\#define[^\n]*\n)|(\#{ws}define[^\n]*\n) string \"([^\"\n]|\"\"|\\\")*\" charac ('[^'\n]')|('''') a [^\*]*(\*)+ a_comment (\/\/[^\n]*\n) %START NORM COMMENT ACOMMENT DEFINE DEFCOM %% {BEGIN NORM; fflush(stdout); yylval=0;} {ws} {/* no action, no return */} asm {return (TOTHER);} auto {return (TAUTO);} break {return (TOTHER);} case {return (TOTHER);} char {return (TCHAR);} class {return (TCLASS);} const {return (TOTHER);} continue {return (TOTHER);} default {return (TOTHER);} delete {return (TOTHER);} do {return (TOTHER);} double {return (TOTHER);} else {return (TOTHER);} enum {return (TENUM);} extern {return (TEXTERN);} float {return (TFLOAT);} for {return (TOTHER);} friend {return (TFRIEND);} goto {return (TOTHER);} if {return (TOTHER);} inline {return (TOTHER);} int {return (TINT);} long {return (TLONG);} new {return (TOTHER);} operator {return (TOTHER);} overload {return (TOTHER);} public {return (TPUBLIC);} register {return (TREG);} reg {return (TREG);} return {return (TOTHER);} short {return (TSHORT);} sizeof {return (TOTHER);} static {return (TSTATIC);} struct {return (TSTRUCT);} switch {return (TOTHER);} this {return (TOTHER);} typedef {return (TTYPEDEF);} union {return (TUNION);} unsigned {return (TUNSIGNED);} virtual {return (TVIRTUAL);} void {return (TVOID);} while {return (TOTHER);} #undef {BEGIN DEFINE;} #define {BEGIN DEFINE;} #ifndef {BEGIN DEFINE;} #ifdef {BEGIN DEFINE;} #include {return (TOTHER);} #if {BEGIN DEFINE;} #endif {BEGIN DEFINE;} #elif {BEGIN DEFINE;} #line {return (TOTHER);} "(" {return (TLPAREN);} ")" {return (TRPAREN);} "{" {level++; return (TLBRACE);} "}" {level--; if (level == 0) strcpy (lastcaller, ""); return (TRBRACE);} "[" {return (TLBRACK);} "]" {return (TRBRACK);} ":" {return (TCOLON);} "::" {return (TDBLCOLON);} "*" {return (TSTAR);} "," {return (TCOMMA);} ";" {return (TSEMI);} "=" {return (TEQUAL);} {funcid2} {do_funcid(); return (TIDENT);} {funcid} {do_funcid(); return (TIDENT);} {number1} {return (TNUM);} {number2} {return (TNUM);} {number3} {return (TNUM);} {number4} {return (TNUM);} {number5} {return (TNUM);} {number6} {return (TNUM);} {string} {return (TOTHER);} {charac} {return (TOTHER);} . {return (TOTHER);} "/*" {BEGIN COMMENT;} "//" {BEGIN ACOMMENT;} . {} \n {BEGIN NORM;} . {} \n {} "*/" {BEGIN NORM;} \\ {complex_define = 1;} . {} \n {if ( !complex_define ) BEGIN NORM; else complex_define = 0;} "/*" {BEGIN DEFCOM;} . {} \n {} "*/" {BEGIN DEFINE;} %% do_funcid () { funcid = (save_ident *) xmalloc (sizeof(save_ident)); funcid->name = savestr (yytext); funcid->charpos = yycharno - yyleng + 1; funcid->line = yylineno; push (funcid); }