2000-09-18 15:33:13 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* OpenOffice.org 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 Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
2008-04-11 08:35:27 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 15:33:13 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _LEX_HXX
|
|
|
|
#define _LEX_HXX
|
|
|
|
|
|
|
|
#include <hash.hxx>
|
|
|
|
#include <tools/gen.hxx>
|
|
|
|
#include <tools/stream.hxx>
|
|
|
|
|
|
|
|
/******************** enum ***********************************************/
|
|
|
|
enum SVTOKEN_ENUM { SVTOKEN_EMPTY, SVTOKEN_COMMENT,
|
|
|
|
SVTOKEN_INTEGER, SVTOKEN_STRING,
|
|
|
|
SVTOKEN_BOOL, SVTOKEN_IDENTIFIER,
|
|
|
|
SVTOKEN_CHAR, SVTOKEN_RTTIBASE,
|
|
|
|
SVTOKEN_EOF, SVTOKEN_HASHID };
|
|
|
|
|
|
|
|
/******************** class SvToken **************************************/
|
|
|
|
class BigInt;
|
|
|
|
class SvToken
|
|
|
|
{
|
|
|
|
friend class SvTokenStream;
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr nLine, nColumn;
|
2000-09-18 15:33:13 +00:00
|
|
|
SVTOKEN_ENUM nType;
|
|
|
|
ByteString aString;
|
|
|
|
union
|
|
|
|
{
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr nLong;
|
|
|
|
sal_Bool bBool;
|
2000-09-18 15:33:13 +00:00
|
|
|
char cChar;
|
|
|
|
// SvRttiBase * pComplexObj;
|
|
|
|
SvStringHashEntry * pHash;
|
|
|
|
};
|
|
|
|
public:
|
|
|
|
SvToken();
|
|
|
|
SvToken( const SvToken & rObj );
|
2010-11-03 15:49:08 +01:00
|
|
|
SvToken( sal_uIntPtr n );
|
|
|
|
SvToken( SVTOKEN_ENUM nTypeP, sal_Bool b );
|
2000-09-18 15:33:13 +00:00
|
|
|
SvToken( char c );
|
|
|
|
SvToken( SVTOKEN_ENUM nTypeP, const ByteString & rStr );
|
|
|
|
// SvToken( SvRttiBase * pComplexObj );
|
|
|
|
SvToken( SVTOKEN_ENUM nTypeP );
|
|
|
|
|
|
|
|
SvToken & operator = ( const SvToken & rObj );
|
|
|
|
|
|
|
|
ByteString GetTokenAsString() const;
|
|
|
|
SVTOKEN_ENUM GetType() const { return nType; }
|
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
void SetLine( sal_uIntPtr nLineP ) { nLine = nLineP; }
|
|
|
|
sal_uIntPtr GetLine() const { return nLine; }
|
2000-09-18 15:33:13 +00:00
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
void SetColumn( sal_uIntPtr nColumnP ) { nColumn = nColumnP; }
|
|
|
|
sal_uIntPtr GetColumn() const { return nColumn; }
|
2000-09-18 15:33:13 +00:00
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool IsEmpty() const { return nType == SVTOKEN_EMPTY; }
|
|
|
|
sal_Bool IsComment() const { return nType == SVTOKEN_COMMENT; }
|
|
|
|
sal_Bool IsInteger() const { return nType == SVTOKEN_INTEGER; }
|
|
|
|
sal_Bool IsString() const { return nType == SVTOKEN_STRING; }
|
|
|
|
sal_Bool IsBool() const { return nType == SVTOKEN_BOOL; }
|
|
|
|
sal_Bool IsIdentifierHash() const
|
2000-09-18 15:33:13 +00:00
|
|
|
{ return nType == SVTOKEN_HASHID; }
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool IsIdentifier() const
|
2000-09-18 15:33:13 +00:00
|
|
|
{
|
|
|
|
return nType == SVTOKEN_IDENTIFIER
|
|
|
|
|| nType == SVTOKEN_HASHID;
|
|
|
|
}
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool IsChar() const { return nType == SVTOKEN_CHAR; }
|
|
|
|
sal_Bool IsRttiBase() const { return nType == SVTOKEN_RTTIBASE; }
|
|
|
|
sal_Bool IsEof() const { return nType == SVTOKEN_EOF; }
|
2000-09-18 15:33:13 +00:00
|
|
|
|
|
|
|
const ByteString & GetString() const
|
|
|
|
{
|
|
|
|
return IsIdentifierHash()
|
|
|
|
? pHash->GetName()
|
|
|
|
: aString;
|
|
|
|
}
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr GetNumber() const { return nLong; }
|
|
|
|
sal_Bool GetBool() const { return bBool; }
|
2000-09-18 15:33:13 +00:00
|
|
|
char GetChar() const { return cChar; }
|
|
|
|
// SvRttiBase *GetObject() const { return pComplexObj; }
|
|
|
|
|
|
|
|
void SetHash( SvStringHashEntry * pHashP )
|
|
|
|
{ pHash = pHashP; nType = SVTOKEN_HASHID; }
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool HasHash() const
|
2000-09-18 15:33:13 +00:00
|
|
|
{ return nType == SVTOKEN_HASHID; }
|
|
|
|
SvStringHashEntry * GetHash() const { return pHash; }
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool Is( SvStringHashEntry * pEntry ) const
|
2000-09-18 15:33:13 +00:00
|
|
|
{ return IsIdentifierHash() && pHash == pEntry; }
|
|
|
|
};
|
|
|
|
|
|
|
|
inline SvToken::SvToken()
|
|
|
|
: nType( SVTOKEN_EMPTY ) {}
|
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
inline SvToken::SvToken( sal_uIntPtr n )
|
2000-09-18 15:33:13 +00:00
|
|
|
: nType( SVTOKEN_INTEGER ), nLong( n ) {}
|
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
inline SvToken::SvToken( SVTOKEN_ENUM nTypeP, sal_Bool b )
|
2000-09-18 15:33:13 +00:00
|
|
|
: nType( nTypeP ), bBool( b ) {}
|
|
|
|
|
|
|
|
inline SvToken::SvToken( char c )
|
|
|
|
: nType( SVTOKEN_CHAR ), cChar( c ) {}
|
|
|
|
|
|
|
|
inline SvToken::SvToken( SVTOKEN_ENUM nTypeP, const ByteString & rStr )
|
|
|
|
: nType( nTypeP ), aString( rStr ) {}
|
|
|
|
|
|
|
|
/*
|
|
|
|
inline SvToken::SvToken( SvRttiBase * pObj )
|
|
|
|
: nType( SVTOKEN_RTTIBASE ), pComplexObj( pObj )
|
|
|
|
{ pObj->AddRef(); }
|
|
|
|
*/
|
|
|
|
|
|
|
|
inline SvToken::SvToken( SVTOKEN_ENUM nTypeP )
|
|
|
|
: nType( nTypeP ) {}
|
|
|
|
|
|
|
|
DECLARE_LIST( SvTokenList, SvToken * )
|
|
|
|
|
|
|
|
/******************** class SvTokenStream ********************************/
|
|
|
|
class SvTokenStream
|
|
|
|
{
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr nLine, nColumn;
|
2000-09-18 15:33:13 +00:00
|
|
|
int nBufPos;
|
|
|
|
int c; // naechstes Zeichen
|
|
|
|
CharSet nCharSet;
|
|
|
|
char * pCharTab; // Zeiger auf die Konverierungstabelle
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uInt16 nTabSize; // Tabulator Laenge
|
2000-09-18 15:33:13 +00:00
|
|
|
ByteString aStrTrue;
|
|
|
|
ByteString aStrFalse;
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr nMaxPos;
|
2000-09-18 15:33:13 +00:00
|
|
|
|
|
|
|
SvFileStream * pInStream;
|
|
|
|
SvStream & rInStream;
|
|
|
|
String aFileName;
|
|
|
|
SvTokenList aTokList;
|
|
|
|
SvToken * pCurToken;
|
|
|
|
|
|
|
|
void InitCtor();
|
|
|
|
|
|
|
|
ByteString aBufStr;
|
|
|
|
int GetNextChar();
|
|
|
|
int GetFastNextChar()
|
|
|
|
{
|
2010-11-03 15:49:08 +01:00
|
|
|
return aBufStr.GetChar((sal_uInt16)nBufPos++);
|
2000-09-18 15:33:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FillTokenList();
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr GetNumber();
|
|
|
|
sal_Bool MakeToken( SvToken & );
|
|
|
|
sal_Bool IsEof() const { return rInStream.IsEof(); }
|
2000-09-18 15:33:13 +00:00
|
|
|
void SetMax()
|
|
|
|
{
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uIntPtr n = Tell();
|
2000-09-18 15:33:13 +00:00
|
|
|
if( n > nMaxPos )
|
|
|
|
nMaxPos = n;
|
|
|
|
}
|
|
|
|
void CalcColumn()
|
|
|
|
{
|
|
|
|
// wenn Zeilenende berechnung sparen
|
|
|
|
if( 0 != c )
|
|
|
|
{
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uInt16 n = 0;
|
2000-09-18 15:33:13 +00:00
|
|
|
nColumn = 0;
|
|
|
|
while( n < nBufPos )
|
|
|
|
nColumn += aBufStr.GetChar(n++) == '\t' ? nTabSize : 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
SvTokenStream( const String & rFileName );
|
|
|
|
SvTokenStream( SvStream & rInStream, const String & rFileName );
|
|
|
|
~SvTokenStream();
|
|
|
|
|
|
|
|
const String & GetFileName() const { return aFileName; }
|
|
|
|
SvStream & GetStream() { return rInStream; }
|
|
|
|
|
|
|
|
void SetCharSet( CharSet nSet );
|
|
|
|
CharSet GetCharSet() const { return nCharSet; }
|
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
void SetTabSize( sal_uInt16 nTabSizeP )
|
2000-09-18 15:33:13 +00:00
|
|
|
{ nTabSize = nTabSizeP; }
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uInt16 GetTabSize() const { return nTabSize; }
|
2000-09-18 15:33:13 +00:00
|
|
|
|
|
|
|
SvToken * GetToken_PrevAll()
|
|
|
|
{
|
|
|
|
SvToken * pRetToken = pCurToken;
|
|
|
|
if( NULL == (pCurToken = aTokList.Prev()) )
|
|
|
|
// Current Zeiger nie Null
|
|
|
|
pCurToken = pRetToken;
|
|
|
|
|
|
|
|
return pRetToken;
|
|
|
|
}
|
|
|
|
SvToken * GetToken_NextAll()
|
|
|
|
{
|
|
|
|
SvToken * pRetToken = pCurToken;
|
|
|
|
if( NULL == (pCurToken = aTokList.Next()) )
|
|
|
|
// Current Zeiger nie Null
|
|
|
|
pCurToken = pRetToken;
|
|
|
|
SetMax();
|
|
|
|
return pRetToken;
|
|
|
|
}
|
|
|
|
SvToken * GetToken_Next()
|
|
|
|
{
|
|
|
|
// Kommentare werden initial entfernt
|
|
|
|
return GetToken_NextAll();
|
|
|
|
}
|
|
|
|
SvToken * GetToken() const { return pCurToken; }
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_Bool Read( char cChar )
|
2000-09-18 15:33:13 +00:00
|
|
|
{
|
|
|
|
if( pCurToken->IsChar()
|
|
|
|
&& cChar == pCurToken->GetChar() )
|
|
|
|
{
|
|
|
|
GetToken_Next();
|
2010-11-03 15:49:08 +01:00
|
|
|
return sal_True;
|
2000-09-18 15:33:13 +00:00
|
|
|
}
|
|
|
|
else
|
2010-11-03 15:49:08 +01:00
|
|
|
return sal_False;
|
2000-09-18 15:33:13 +00:00
|
|
|
}
|
|
|
|
void ReadDelemiter()
|
|
|
|
{
|
|
|
|
if( pCurToken->IsChar()
|
|
|
|
&& (';' == pCurToken->GetChar()
|
|
|
|
|| ',' == pCurToken->GetChar()) )
|
|
|
|
{
|
|
|
|
GetToken_Next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-11-03 15:49:08 +01:00
|
|
|
sal_uInt32 Tell() const
|
2000-09-18 15:33:13 +00:00
|
|
|
{ return aTokList.GetCurPos(); }
|
2010-11-03 15:49:08 +01:00
|
|
|
void Seek( sal_uInt32 nPos )
|
2000-09-18 15:33:13 +00:00
|
|
|
{
|
|
|
|
pCurToken = aTokList.Seek( nPos );
|
|
|
|
SetMax();
|
|
|
|
}
|
2010-11-03 15:49:08 +01:00
|
|
|
void SeekRel( sal_Int32 nRelPos )
|
2000-09-18 15:33:13 +00:00
|
|
|
{
|
|
|
|
pCurToken = aTokList.Seek( Tell() + nRelPos );
|
|
|
|
SetMax();
|
|
|
|
}
|
|
|
|
void SeekEnd()
|
|
|
|
{
|
|
|
|
pCurToken = aTokList.Seek( nMaxPos );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _LEX_HXX
|
|
|
|
|