|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: CXX.HXX
//
// Contents: C and C++ filter
//
// History: 26-Jun-92 BartoszM Created
//
//---------------------------------------------------------------------------/
#pragma once
#define cxxDebugOut( x )
#define MAXIDENTIFIER 80
//
// These are the tokens recognized by the scanner
//
enum CToken { tEnd, // EOF
tClass, // class
tStruct, // struct
tUnion, // union
tInterface, // interface
tEnum, // enum
tLBrace, // {
tRBrace, // }
tSemi, // ;
tDoubleColon, // ::
tLParen, // (
tRParen, // )
tDefine, // #define
tInclude, // #include
tTypedef, // typedef
tComma, // ,
tStar, // *
};
//+---------------------------------------------------------------------------
//
// Class: CxxScanner
//
// Interface:
//
// History: 26-Jun-92 BartoszM Created
//
//----------------------------------------------------------------------------
class CxxScanner { public: CxxScanner();
void Init(CFilterTextStream* pStream);
CToken Accept() { return NextToken(_pStream->GetChar()); }
CToken Accept(int c) { return NextToken(c); }
int EatComment(); int EatString(); int EatCharLiteral(); int EatPrepro();
CToken Token() { return(_token); } int LoadName(int c); int LoadIncludeFileName(int c); int SkipName(int c); void IgnorePreamble ( BOOL f ) { _fIgnorePreamble = f; } void SetIdFound( BOOL f ) { _fIdFound = f; } BOOL IdFound() { return _fIdFound; } const WCHAR* GetLastIdent ( FILTERREGION& region) const { region = _region; return(_buf); }
ULONG Lines() { return _cLines; }
private:
CToken NextToken(int c);
CFilterTextStream* _pStream; // stream
WCHAR _buf[MAXIDENTIFIER+1]; // buffer for identifiers
FILTERREGION _region; // region where the identifier was found
CToken _token; // recognized token
BOOL _fIgnorePreamble; // state flag--scanning preamble
ULONG _cLines; BOOL _fScanningPrepro; // state flag--parsing a prepro stmt
BOOL _fIdFound; // state flag--set to TRUE when
// an identifier is scanned
};
//+---------------------------------------------------------------------------
//
// Class: CxxParser
//
// Interface:
//
// History: 26-Jun-92 BartoszM Created
//
//----------------------------------------------------------------------------
class CxxParser { enum TokenType { ttClass, ttFunction, ttMethod, ttInlineMethod };
public:
CxxParser();
~CxxParser();
void Init( CFilterTextStream * pStream );
BOOL Parse();
PROPSPEC GetAttribute() { return _attribute; }
BOOL GetTokens( ULONG * pcwcBuffer, WCHAR * awcBuffer);
void GetRegion ( FILTERREGION& region );
BOOL GetValueAttribute( PROPSPEC & ps );
PROPVARIANT * GetValue();
void SkipValue() { _iVal++; }
private:
void PutClass (); void PutMethod (); void PutInlineMethod(); void PutFunction ();
void SetClass() { const WCHAR* buf = _scan.GetLastIdent (_regionClass); wcsncpy ( _strClass, buf, MAXIDENTIFIER ); _strClass[ MAXIDENTIFIER ] = 0; }
void SetName() { const WCHAR* buf = _scan.GetLastIdent (_regionName); wcsncpy ( _strName, buf, MAXIDENTIFIER ); _strName[ MAXIDENTIFIER ] = 0; }
CxxScanner _scan; // the scanner
WCHAR _strClass[MAXIDENTIFIER+1]; // buffer for class name
FILTERREGION _regionClass; WCHAR _strName [MAXIDENTIFIER+1]; // buffer for identifier
FILTERREGION _regionName; TokenType _tokenType; // class, function, method?
int _scope; // depth of scope counter
int _inClass; // depth of class
PROPSPEC _attribute;
CToken _token; ULONG _cwcCopiedClass; ULONG _cwcCopiedName;
enum CxxVal { Function, Class, Lines };
unsigned _iVal; PROPSPEC _psVal[3]; CPropVar * _aVal[3];
#if CIDBG == 1
CToken _classToken; #endif // CIDBG == 1
BOOL _fParsingTypedef; // state flag--parsing a typedef
BOOL _fParsingFnPtrTypedef; // state flag--parsing a typedef
// of a fn pointer
int _typedefScope; };
|