| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: No names yet. |
| 3 | // Purpose: Implementation of C++/Java parser |
| 4 | // compatible with SourceParserBase interface |
| 5 | // Author: Aleksandras Gluchovas |
| 6 | // Modified by: |
| 7 | // Created: 22/09/98 |
| 8 | // RCS-ID: $Id$ |
| 9 | // Copyright: (c) Aleskandars Gluchovas |
| 10 | // Licence: wxWindows licence |
| 11 | ///////////////////////////////////////////////////////////////////////////// |
| 12 | |
| 13 | #ifndef __CJPARSESR_G__ |
| 14 | #define __CJPARSESR_G__ |
| 15 | |
| 16 | #include "srcparser.h" |
| 17 | |
| 18 | #include <memory.h> |
| 19 | #include <stdlib.h> |
| 20 | #include <stdio.h> |
| 21 | |
| 22 | #if wxUSE_IOSTREAMH |
| 23 | #include <iostream.h> |
| 24 | #else |
| 25 | #include <iostream> |
| 26 | #endif |
| 27 | |
| 28 | // class parses given "memory-resident" Java or C++ source code |
| 29 | // and captures information about classes/attrubutes/methods/ |
| 30 | // arguments/etc into structures. Conforms with SourceParserBase |
| 31 | // interface requirements. |
| 32 | |
| 33 | class CJSourceParser : public SourceParserBase |
| 34 | { |
| 35 | protected: |
| 36 | // begining of the full-text area of the source file |
| 37 | char* mpStart; |
| 38 | |
| 39 | // points to first character after the end |
| 40 | // of teh full-text area |
| 41 | char* mpEnd; |
| 42 | |
| 43 | // current "privacy level" |
| 44 | int mCurVis; |
| 45 | |
| 46 | // current parsing position int full-text area |
| 47 | char* cur; |
| 48 | |
| 49 | // about the current class |
| 50 | bool mIsVirtual; |
| 51 | bool mIsTemplate; |
| 52 | size_t mNestingLevel; |
| 53 | |
| 54 | // context data for which is currently being collected |
| 55 | spContext* mpCurCtx; |
| 56 | |
| 57 | int mCurCtxType; // type of the current context |
| 58 | |
| 59 | bool mCommentsOn; |
| 60 | bool mMacrosOn; |
| 61 | |
| 62 | protected: |
| 63 | |
| 64 | void AttachComments( spContext& ctx, char* cur ); |
| 65 | void ParseKeyword( char*& cur ); |
| 66 | bool ParseNameAndRetVal( char*& cur, bool& isAMacro ); |
| 67 | bool ParseArguments( char*& cur ); |
| 68 | void ParseMemberVar( char*& cur ); |
| 69 | void SkipFunction( char*& cur ); |
| 70 | void SkipFunctionBody( char*& cur ); |
| 71 | bool CheckVisibilty( char*& cur ); |
| 72 | |
| 73 | void AddClassNode( char*& cur ); |
| 74 | void AddMacroNode( char*& cur ); |
| 75 | void AddEnumNode( char*& cur ); |
| 76 | void AddTypeDefNode( char*& cur ); |
| 77 | |
| 78 | void DumpOperationInfo( spOperation& info, const string& tab, wxSTD ostream& os ); |
| 79 | void DumpClassHeader( spClass& info, wxSTD ostream& os ); |
| 80 | void DumpClassBody( spClass& info, wxSTD ostream& os ); |
| 81 | |
| 82 | public: |
| 83 | |
| 84 | // NOTE:: discarding of macros or comments improves performance and |
| 85 | // decreases memory usage |
| 86 | |
| 87 | CJSourceParser(bool collectCommnets = 1, |
| 88 | bool collectMacros = 1); |
| 89 | |
| 90 | // returns the root-node of the created context tree |
| 91 | // (user is responsible for releasing it from the heep) |
| 92 | // "end" should point to the last (character + 1) of the |
| 93 | // source text |
| 94 | |
| 95 | virtual spFile* Parse( char* start, char* end ); |
| 96 | }; |
| 97 | |
| 98 | // inline'ed helpers used (just info): |
| 99 | /* |
| 100 | static inline void skip_to_eol( char*& cur ); |
| 101 | static inline void skip_eol( char*& cur ); |
| 102 | static inline bool skip_to_next_comment_in_the_line( char*& cur ); |
| 103 | static void skip_to_prev_line( char*& cur ); |
| 104 | static inline void skip_comments( char*& cur ); |
| 105 | static inline void clear_commets_queue(); |
| 106 | static inline void skip_quoted_string( char*& cur ); |
| 107 | static inline bool get_next_token( char*& cur ); |
| 108 | static inline void skip_preprocessor_dir( char*& cur ); |
| 109 | static void skip_token( char*& cur ); |
| 110 | static inline size_t get_token_len( char* tok ); |
| 111 | static inline bool cmp_tokens( char* tok1, char* tok2 ); |
| 112 | static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len ); |
| 113 | static inline void skip_tempalate_statement( char*& cur ); |
| 114 | static inline void skip_statement( char*& cur ); |
| 115 | static inline void skip_token_back( char*& cur ); |
| 116 | static inline void skip_next_token_back( char*& cur ); |
| 117 | static string get_token_str( char* cur ); |
| 118 | static size_t skip_block( char*& cur ); |
| 119 | static inline bool skip_imp_block( char*& cur ); |
| 120 | static bool is_class_token( char*& cur ); |
| 121 | inline static bool is_forward_decl( char* cur ); |
| 122 | inline static bool is_function( char* cur, bool& isAMacro ); |
| 123 | static inline void skip_scope_block( char*& cur ); |
| 124 | static void arrange_indirection_tokens_between( string& type, string& identifier ); |
| 125 | static bool is_keyword( char* cur ); |
| 126 | static inline void get_string_between( char* start, char* end, string* pStr ); |
| 127 | static char* set_comment_text( string& text, char* start ); |
| 128 | */ |
| 129 | |
| 130 | #endif |