home *** CD-ROM | disk | FTP | other *** search
- /* $Id: rxscan.L,v 1.72 1998/11/16 14:32:51 zeller Exp $ -*- C++ -*- */
- /* DDD regexp scanner */
-
- %{
- // Copyright (C) 1997-1998 Technische Universitaet Braunschweig, Germany.
- // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
- //
- // This file is part of DDD.
- //
- // DDD is free software; you can redistribute it and/or
- // modify it under the terms of the GNU General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- //
- // DDD is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- // See the GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public
- // License along with DDD -- see the file COPYING.
- // If not, write to the Free Software Foundation, Inc.,
- // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- //
- // DDD is the data display debugger.
- // For details, see the DDD World-Wide-Web page,
- // `http://www.cs.tu-bs.de/softech/ddd/',
- // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
-
- char rxscan_rcsid[] =
- "$Id: rxscan.L,v 1.72 1998/11/16 14:32:51 zeller Exp $";
-
- // Maximal length of a token when using LEX.
- #define MAX_LEX_TOKEN_SIZE 8192
-
- // I think that even a low limit of, say, 200 characters or less will
- // make DDD work just fine. Please note that MAX_LEX_TOKEN_SIZE
- // effectively limits the length of the input to be matched, so if you
- // set it to 4000, only the first 4000 characters of GDB output will be
- // matched; the remaining ones will be ignored (by the regexp matcher,
- // not by DDD).
- //
- // In most cases, it does not matter whether the first 80 or 200 or 8192
- // characters of some GDB output are matched by the regular expression.
- // I have run DDD with a deliberately low limit of 80 characters, and run
- // into no problems whatsoever, even if only the first 80 characters were
- // ever matched. The reason is that most DDD regexps that go this far
- // have the form `<something>.*', and it does not matter whether the
- // trailing `.*' matches 80 or 8192 characters. So, in practice, raising
- // or lowering the MAX_LEX_TOKEN_SIZE won't make a big difference unless
- // you make it lower than 20 characters or so. (8192 is just to stay on
- // the safe side; I don't have the time to verify all DDD regexps.)
-
-
- static const char *the_prefix; // Prefix
- static const char *the_text; // Pointer to next text character
- static int the_length; // Number of characters to read
-
- // Input routines
-
- #ifdef FLEX_SCANNER
- // The way FLEX wants input
- #undef YY_INPUT
- #define YY_INPUT(buf, result, max_size) \
- {\
- int k = 0; \
- while (*the_prefix != '\0' && k < max_size) \
- buf[k++] = *the_prefix++; \
- \
- int len = min(max_size, the_length); \
- if (len == 0) \
- result = YY_NULL; \
- else \
- {\
- int j = 0;\
- char *bb = buf + k;\
- while (j < len) \
- bb[j++] = *the_text++; \
- the_length -= len; \
- result = k + len; \
- }\
- }
- #define YY_NO_UNPUT
-
- // Reset the scanner
- static void reset_scanner() { yyrestart(yyin); }
-
- #else // !defined(FLEX_SCANNER)
-
- // Input routines for SUN lex and likewise
- static char pushback[BUFSIZ];
- static char *pushback_ptr = pushback;
-
- inline int do_unput(char c)
- {
- if (c != 0)
- *pushback_ptr++ = c;
-
- return c;
- }
-
- static int do_input()
- {
- if (pushback_ptr != pushback)
- return *--pushback_ptr;
-
- if (*the_prefix != '\0')
- return *the_prefix++;
-
- if (the_length == 0)
- return 0;
-
- the_length--;
- return *the_text++;
- }
-
- #ifdef input
- #undef input
- #define input do_input
- #endif
-
- #ifdef unput
- #undef unput
- #define unput do_unput
- #endif
-
- // Reset the scanner
- static void reset_scanner() { pushback_ptr = pushback; }
-
- #endif // !defined(FLEX_SCANNER)
-
-
- #define YY_SKIP_YYWRAP
- extern "C" int yywrap()
- {
- return 1;
- }
-
- // Returning values
- #ifdef FLEX_SCANNER
-
- #define YY_DECL static const regex *yylex YY_PROTO(( void ))
- #define RETURN(x) return x
-
- #else
-
- // Ordinary LEX uses `int yylex()'
- #define RETURN(x) return x ? 1 : 0
-
- #endif
-
-
-
- // Buffer size. FLEX can match tokens of arbitrary length (all praise
- // FLEX!), but classical LEX has a limit of YYLMAX characters.
- // Attempt to raise this to some larger value.
- #if !defined(FLEX_SCANNER) && defined(YYLMAX)
- #if YYLMAX < MAX_LEX_TOKEN_SIZE
- #undef YYLMAX
- #define YYLMAX MAX_LEX_TOKEN_SIZE
- #endif
- #endif
-
-
-
- // Anything not in the list is `not matched'
- #ifdef ECHO
- #undef ECHO
- #endif
- #define ECHO RETURN(0)
-
- #ifdef FLEX_SCANNER
- // #defining YY_BREAK to empty disables warnings about unreachable breaks.
- #define YY_BREAK DO_NOT_BREAK
- #define DO_NOT_BREAK
- #define BREAK break;
- #endif // FLEX_SCANNER
- %}
-
- /* Addresses -- in various formats */
- A (0x[0-9a-fA-F]+|0[0-9a-fA-F]+[hH]|H\'[0-9a-fA-F]+|00+|[(]nil[)]|NIL|null|@[0-9a-fA-F]+|16_[0-9a-f]+)
-
- /* Simple prefix of address */
- a [0H@]
-
- /* Whitespace */
- w [ \f\t]
-
- /* Optional Whitespace */
- _ [ \f\t]*
-
- /* Non-empty sequence of Whitespace */
- W [ \f\t]+
-
- /* Digit */
- d [0-9]
-
- /* Non-empty sequence of digits */
- D [0-9]+
-
- /* Positive number */
- P [1-9][0-9]*
-
- /* Hex address */
- x (0(0|x)[0-9a-f]+|[(]nil[)]|NIL|null)
-
- /* An arbitrary character */
- c (.|\n)
-
- /* A sequence of arbitrary characters */
- C (.|\n)*
-
- /* `virtual table', in all variants */
- V v(irtual{W})?t(a)?bl(e)?
-
- /* A `standard' identifier. Also includes Perl identifiers. */
- I ([A-Za-z_$@%][A-Za-z0-9_$]*|[$]([^ \n\t\f]|[0-9]+))
-
- /* A Java class identifier */
- J [A-Za-z_$][A-Za-z0-9_$.]*
-
- /* This lexer is quite huge. SunOS lex and AIX lex wants some extra sizes. */
- %e 5000
- %k 10000
- %p 15000
- %a 25000
- %n 5000
- %o 35000
-
- %%
- 01address{W}{A} RETURN(&rxaddr);
- 02{A} RETURN(&rxaddress);
- 03{A}{w}in{w} RETURN(&rxaddress_in);
- 04{a} RETURN(&rxaddress_start);
- 05[A-Za-z]+ RETURN(&rxalpha);
- 06[0-9A-Za-z]+ RETURN(&rxalphanum);
- 07[(][^0-9][^)]*[)] RETURN(&rxarglist);
- 08[)]?{d}*[1-9]-?{_}\,{_}{d}*[1-9]-?[(]?{W}ta{W}{C} RETURN(&rxat);
- 09{w}? RETURN(&rxblank);
- 10[ ]+ RETURN(&rxblanks);
- 11{W} RETURN(&rxblanks_or_tabs);
- 12{_}([th]*(b|bre|brea|break|b[a-z])|cl|cle|clea|clear|d[a-z]|info{W}(li|lin|line)|ignore|cond|condition|when|stop)({W}{C})? RETURN(&rxbreak_cmd);
- 13{_}cd({W}{C})? RETURN(&rxcd_cmd);
- 14[^:]*:[^:]*:{_}{D}{C} RETURN(&rxcolons);
- 15{C}:{C}core{C} RETURN(&rxcore);
- 16{_}(attach|core(-file)?)({W}{C})? RETURN(&rxcore_cmd);
- 17\r\r*\n RETURN(&rxcrlf);
- 18{_}[a-z ]*display({W}{C})? RETURN(&rxdata);
- 19[^ \t\n)}][^=\n]*{w}={w} RETURN(&rxdbx_begin_of_display);
- 20[(]{P}[)]{w} RETURN(&rxdbx_begin_of_display_info);
- 21[a-zA-Z_$0-9]*` RETURN(&rxdbx_scope);
- 22[a-zA-Z_$][a-zA-Z_$0-9]*[(]{C}[)]{C}([[]{C}[]]|\,{w}line{w}{C}) RETURN(&rxdbxframe);
- 23[a-zA-Z_$][^[]*:{_}{P}{W}{C} RETURN(&rxdbxfunc);
- 24{C}line{W}{P}{W}in{W}(file{W})?\"[^\"]*\"\n{C} RETURN(&rxdbxfunc2);
- 25[[][^\133]*:{P}[^\133]*[]]{C} RETURN(&rxdbxpos);
- 26dbx:{W}warning:.*option{W}only{W}recognized{W}for.*\n RETURN(&rxdbxwarn1);
- 27dbx:{W}warning:.*unknown{W}language.*\n RETURN(&rxdbxwarn2);
- 28{_}(debug|givenfile)({W}{C})? RETURN(&rxdebug_cmd);
- 29{W}no{W}tnedneped{W} RETURN(&rxdep);
- 30{_}disable{W}display({W}{C})? RETURN(&rxdisable);
- 31{_}(disp(lay)?|plot)({W}{C})? RETURN(&rxdisplay);
- 32{_}(disp(lay)?|plot){W} RETURN(&rxdisplay_cmd);
- 33{_}(disp(lay)?|plot){W}{C} RETURN(&rxdisplay_cmd_and_args);
- 34Do{_}n['o]t RETURN(&rxdont);
- 35\/[^/]*[^/.]\/[.][.]\/ RETURN(&rxdotdot);
- 36-?(({D}\.{d}*)|({D})|(\.{D}))([eE][+-]?{D})? RETURN(&rxdouble);
- 37{_}do(wn)?({W}{C})? RETURN(&rxdown_cmd);
- 38{_}enable{W}display({W}{C})? RETURN(&rxenable);
- 39[^{};,\n= ]+{W}={W}[^{}();,\n= ]+{W}={W}{C} RETURN(&rxeqeq);
- 40{_}file({W}{C})? RETURN(&rxfile_cmd);
- 41[^ "'`/]*\/ RETURN(&rxfilepath);
- 42{_}use{W}{C} RETURN(&rxuse_cmd);
- 43#{D}{W}{A} RETURN(&rxframe_addr);
- 44{_}(up|do|down|f|fra|fram|frame|suspend|resume|top|V)({W}{C})? RETURN(&rxframe_cmd);
- 45[a-zA-Z0-9_$][(] RETURN(&rxfunction_call);
- 46{P}:{W}[^ ] RETURN(&rxgdb_begin_of_display);
- 47{P}:{w}{w}{w} RETURN(&rxgdb_begin_of_display_info);
- 48{P} RETURN(&rxgdb_disp_nr);
- 49{C}((class|interface)[(]{J}[)]|[(]{J}:{P}[)]) RETURN(&rxjdbpos);
- 50{_}graph{W}{C} RETURN(&rxgraph_cmd);
- 51{I} RETURN(&rxidentifier);
- 52[[]-?{D}]{C} RETURN(&rxindex);
- 53-?{D} RETURN(&rxint);
- 54([a-zA-Z]+{W}[a-zA-Z]+{C}|{C}[a-zA-Z]+{W}[a-zA-Z]+(\.|>)?)\n? RETURN(&rxinvalid_value);
- 55{_}(func|v){W}{C} RETURN(&rxlookup_cmd);
- 56[a-z]+ RETURN(&rxlowercase);
- 57\(\*{C}\*\){C} RETURN(&rxm3comment);
- 58{_}(sh{W}|!)?make({W}{C})? RETURN(&rxmake_cmd);
- 59members{w}of{w}.+:{w}?\n RETURN(&rxmembers_of_nl);
- 60\[-?{D}\.\.-?{D}\] RETURN(&rxmore_than_one);
- 61[^ ]+:{D}\n RETURN(&rxname_colon_int_nl);
- 62{W}\n{W} RETURN(&rxnl);
- 63\n[1-9] RETURN(&rxnl_int);
- 64\n{_}{A} RETURN(&rxnladdress);
- 65\n{_}{A}{w}in{w} RETURN(&rxnladdress_in);
- 66\n{c}[*] RETURN(&rxnlstar);
- 67no[nt][ -]?(0|zero|null) RETURN(&rxnonzero1);
- 68!={_}(0|zero|null) RETURN(&rxnonzero2);
- 69{_}(echo|help|show|info|where|shell|sh|x)({W}{C})? RETURN(&rxnop_cmd);
- 70@{D}@ RETURN(&rxnum);
- 71{_}(info{W}line)({W}{C})? RETURN(&rxop_cmd);
- 72-[bcdeiIopPrRsx] RETURN(&rxoptions);
- 73Line{W}number{W}{D}{W}is{W}out{W}of{W}range{W}for{W} RETURN(&rxout_of_range);
- 74{_}(dir|directory|path)({W}{C})? RETURN(&rxpath_cmd);
- 75\$pc{_}={_}{A} RETURN(&rxpc);
- 76[a-zA-Z][a-zA-Z0-9 ]*[a-zA-Z0-9][[][1-9][0-9]*[]][ ] RETURN(&rxjdbprompt);
- 77[ ][]][0-9]*[1-9][[][a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z] RETURN(&rxjdbprompt_reverse);
- 78Process{W}{D}:{_} RETURN(&rxprocess1);
- 79Process{W}{D}: RETURN(&rxprocess2);
- 80[(][^ )]*db[^)]*[)]{w} RETURN(&rxprompt);
- 81{C}[(]END[)].* RETURN(&rxq);
- 82@{_}{x}{_}:{C} RETURN(&rxreference);
- 83{_}refresh({W}{C})? RETURN(&rxrefresh_cmd);
- 84{C}([(]press{W}RETURN[)]|Hit{W}RETURN{W}to{W}continue|Type{W}<return>{W}to{W}continue|More{W}[(]n{W}if{W}no[)][?]|{W}cont:{W}).* RETURN(&rxreturn);
- 85{_}(r|rer|rerun|ru|run|R)({W}{C})? RETURN(&rxrun_cmd);
- 86{_}(r|ru|run|rer|rerun|c|cont|contin|continu|continue|sig|sign|signa|signal|u|unt|unti|until|s|si|step|stepi|n|ni|next|nexti|j|ju|jump|k|ki|kill|fin|fini|finis|finish|R|S)({W}{C})? RETURN(&rxrunning_cmd);
- 87Select{w}one{w}of{w}\[{D}{w}-{w}{D}\]:{w} RETURN(&rxselect);
- 88;{_}[}] RETURN(&rxsemicolon_and_brace);
- 89[^-_a-zA-Z0-9] RETURN(&rxsep);
- 90{_}(set{W}var[a-z]*|assign|pq)({W}{C})? RETURN(&rxset1_cmd);
- 91{_}(set|p|print|output){W}[^=]+=[^=]{C} RETURN(&rxset2_cmd);
- 92{_}set{W}args({W}{C})? RETURN(&rxset_args_cmd);
- 93{_}(set|dbxenv|O){W}{C} RETURN(&rxsetting_cmd);
- 94([][a-zA-Z0-9_$@%().`]|->|::)* RETURN(&rxsimple);
- 95{_}disp(lay){W}[^ ]+ RETURN(&rxsingle_display_cmd);
- 96{C}(--More--|line{w}{d}).* RETURN(&rxspace);
- 97Breakpoint{W}{P}\,{W}{A} RETURN(&rxstopped_addr);
- 98{x}?{_}([(]|[{]|record\n|RECORD\n|RECORD{w}|OBJECT{w}|struct|class|interface|union){C} RETURN(&rxstruct_begin);
- 99(>|[[][1-9][0-9]*[]])[ ] RETURN(&rxjdbprompt_nothread);
- A0([)]|[}]|end\n|END\n|end;|END;) RETURN(&rxstruct_end);
- A1{x}?{_}(record\n|RECORD\n|RECORD{w}|OBJECT{w}|struct|class|interface|union){C} RETURN(&rxstruct_keyword_begin);
- A2([Tt]he{W})?[Pp]rogram{W}(exited|terminated|is{W}not{W}being{W}run|no{W}longer{W}exists){C} RETURN(&rxterminated);
- A3{_}(thread|threadgroup|suspend|resume)({W}{C})? RETURN(&rxthread_cmd);
- A4{_}(delete{W}|un)display({W}{C})? RETURN(&rxundisplay);
- A5{_}up({W}{C})? RETURN(&rxup_cmd);
- A6[A-Z]+ RETURN(&rxuppercase);
- A7{A}{W}<[^ \n>]*{W}{V}>[^{},]*[{]{C} RETURN(&rxvtable);
- A8{D}{W}{V}{W}entries\, RETURN(&rxvtable_entries);
- A9[ \n\t\r\v\f]+ RETURN(&rxwhite);
- B0{C}Standard{W}input:{W}END{C} RETURN(&rxxdb);
- B1[^ \t]*:.*:{w}{P}[: ]{C} RETURN(&rxxdbpos);
- B2[<]repeats{W}{P}{W}times[>] RETURN(&rxrepeats);
- B3(::|`)?{I}(([.]|->|::|`){I})* RETURN(&rxchain);
- B4{W}ni{W}nehw{W}(ro{W}won{W})? RETURN(&rxwhen);
- B5Breakpoint{W}{P}\,{W} RETURN(&rxstopped_func);
- B6#{D}{W}{I}[^ \f\t\n]*{W}[(] RETURN(&rxframe_func);
- B7{_}(define|document){W}{C} RETURN(&rxdefine_cmd);
- B8{_}(l|li|lis|list)({W}{C})? RETURN(&rxlist_cmd);
- B9{D}{_}\,{_}{D} RETURN(&rxlist_range);
- C0[^:]*:{P} RETURN(&rxfilepos);
- C1{_}{I}[^({\n=]*:[(] RETURN(&rxdbx_baseclass);
- C2{_}[^=]+=[^=]{C} RETURN(&rxset3_cmd);
- C3{_}DB<+[0-9]*>+{_} RETURN(&rxperlprompt);
- C4[^(]*::[^(]*[(][^:]*:{P}[)]:.* RETURN(&rxperlpos);
- C5{I}[(]{A}[)] RETURN(&rxperlref);
- (.|\n) RETURN(0); // Anything else
- %%
-