2007-03-01 01:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbclass.ch
    * cleaned scope error message

  * harbour/include/hbpp.h
  * harbour/source/pp/ppcore.c
    * added hack for accepting expressions which start with ':' character
      as regular/list match markers
This commit is contained in:
Przemyslaw Czerpak
2007-03-01 00:57:25 +00:00
parent 1cba971155
commit 01c55fa2c1
4 changed files with 74 additions and 38 deletions

View File

@@ -8,6 +8,15 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2007-03-01 01:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbclass.ch
* cleaned scope error message
* harbour/include/hbpp.h
* harbour/source/pp/ppcore.c
* added hack for accepting expressions which start with ':' character
as regular/list match markers
2007-02-28 08:10 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbpp.h
* harbour/source/compiler/complex.c

View File

@@ -181,7 +181,7 @@
#ifdef HB_CLS_NO_OO_ERR
#xtranslate __HB_CLS_ERR([<msg,...>]) =>
#else
#xtranslate __HB_CLS_ERR([<msg,...>]) => ;#error [ <msg>] ; #undef _DUMMY_DEF_
#xtranslate __HB_CLS_ERR([<msg,...>]) => ;#error [ <msg>] ; #line
#endif
#xtranslate __HB_CLS_VARERR(<var>) => __HB_CLS_ERR( Invalid instance variable name: <var> )
@@ -229,7 +229,7 @@ DECLARE HBClass ;
iif( <export>, HB_OO_CLSTP_EXPORTED , ;
iif( <protect>, HB_OO_CLSTP_PROTECTED, ;
iif( <hidde>, HB_OO_CLSTP_HIDDEN, nScope ) ) ) */
#xtranslate __HB_CLS_SCOPE( <x,...> ) => __HB_CLS_ERR( Can not use multiple scope qualifiers! )
#xtranslate __HB_CLS_SCOPE( <x,...> ) => ) __HB_CLS_ERR( Can not use multiple scope qualifiers! )
#xtranslate __HB_CLS_SCOPE( .T., .F., .F. ) => HB_OO_CLSTP_EXPORTED
#xtranslate __HB_CLS_SCOPE( .F., .T., .F. ) => HB_OO_CLSTP_PROTECTED
#xtranslate __HB_CLS_SCOPE( .F., .F., .T. ) => HB_OO_CLSTP_HIDDEN
@@ -266,16 +266,9 @@ DECLARE HBClass ;
static <type> __HB_CLS_MTHNAME <ClassName> <MethodName> ;;
local Self AS CLASS <ClassName> := QSelf() AS CLASS <ClassName>
#ifdef __XHARBOUR__
#xcommand __HB_CLS_DECLARE_METHOD <MethodName> <ClassName> => ;
#xcommand METHOD \<type: FUNCTION, PROCEDURE> <MethodName>\[(\[\<xparams,...>])] CLASS <ClassName> _CLASS_IMPLEMENTATION_ => ;
DECLARED METHOD \<type> <MethodName>\[(\<xparams>)] CLASS <ClassName> ;;
#undef _DUMMY_DEF_
#else
#xcommand __HB_CLS_DECLARE_METHOD <MethodName> <ClassName> => ;
#xcommand METHOD \<type: FUNCTION, PROCEDURE> <MethodName>\[(\[\<xparams,...>])] CLASS <ClassName> _CLASS_IMPLEMENTATION_ => ;
#xcommand __HB_CLS_DECLARE_METHOD <MethodName> <ClassName> => ;
#xcommand METHOD \<type: FUNCTION, PROCEDURE> <MethodName>\[(\[\<xparams,...>])] CLASS <ClassName> _CLASS_IMPLEMENTATION_ => ;
DECLARED METHOD \<type> <MethodName>\[(\<xparams>)] CLASS <ClassName>
#endif
#xcommand METHOD <type: FUNCTION, PROCEDURE> <MethodName> CLASS <ClassName> _CLASS_IMPLEMENTATION_ => ;
__HB_CLS_ERR( Method <MethodName> not declared or declaration mismatch in class: <ClassName> ) ;;

View File

@@ -4,7 +4,7 @@
/*
* Harbour Project source code:
*
*
*
* Copyright 2006 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
* www - http://www.harbour-project.org
@@ -198,6 +198,9 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC;
#define HB_PP_TOKEN_MOD 84
#define HB_PP_TOKEN_POWER 85
#define HB_PP_TOKEN_EPSILON 86
#define HB_PP_TOKEN_SHIFTL 87
#define HB_PP_TOKEN_SHIFTR 88
#define HB_PP_TOKEN_BITXOR 89
#define HB_PP_TOKEN_TYPE(t) ( (t) & 0xff )
/* bitfields */
@@ -266,19 +269,24 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC;
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_RIGHT_SB || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_RIGHT_CB )
#define HB_PP_TOKEN_NEEDLEFT(t) ( HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_ASSIGN || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_PLUSEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MINUSEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MULTEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_DIVEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MODEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EXPEQ || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EQUAL || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EQ )
#define HB_PP_TOKEN_ISNEUTRAL(t) ( HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_DEC || \
HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_INC )
#define HB_PP_TOKEN_NEEDLEFT(t) ( HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_ASSIGN || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_PLUSEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MINUSEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MULTEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_DIVEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MODEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EXPEQ || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EQUAL || \
HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EQ || \
( HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_SEND && \
(t)->spaces == 0 && (t)->pNext && \
( HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_KEYWORD || \
HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_MACROVAR || \
HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_MACROTEXT ) ) )
/* I do not want to replicate exactly Clipper PP behavior and check if
expression is valid.
it's wrong and causes that potentially valid expressions are not
@@ -340,7 +348,7 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC;
HB_PP_TOKEN_ISEXPVAL( (t)->pNext->type ) ) )
#ifdef HB_C52_STRICT
/* Clipper supports quoting by [] for 1-st token in the line so we
/* Clipper supports quoting by [] for 1-st token in the line so we
are checking for HB_PP_TOKEN_NUL in this macro */
#define HB_PP_TOKEN_CANQUOTE(t) ( HB_PP_TOKEN_TYPE(t) != HB_PP_TOKEN_NUL && \
HB_PP_TOKEN_TYPE(t) != HB_PP_TOKEN_KEYWORD && \

View File

@@ -144,7 +144,7 @@ static char * hb_pp_szErrors[] =
};
static const HB_PP_OPERATOR s_operators[] =
static const HB_PP_OPERATOR s_operators[] =
{
{ ".NOT.", 5, "!" , HB_PP_TOKEN_NOT | HB_PP_TOKEN_STATIC },
{ ".AND.", 5, ".AND.", HB_PP_TOKEN_AND | HB_PP_TOKEN_STATIC },
@@ -169,6 +169,11 @@ static const HB_PP_OPERATOR s_operators[] =
{ "!=" , 2, "<>" , HB_PP_TOKEN_NE | HB_PP_TOKEN_STATIC },
{ "<>" , 2, "<>" , HB_PP_TOKEN_NE | HB_PP_TOKEN_STATIC },
{ "->" , 2, "->" , HB_PP_TOKEN_ALIAS | HB_PP_TOKEN_STATIC },
#ifdef __XHARBOUR__
{ "<<" , 2, "<<" , HB_PP_TOKEN_SHIFTL | HB_PP_TOKEN_STATIC },
{ ">>" , 2, ">>" , HB_PP_TOKEN_SHIFTR | HB_PP_TOKEN_STATIC },
{ "^^" , 2, "^^" , HB_PP_TOKEN_BITXOR | HB_PP_TOKEN_STATIC },
#endif
{ "@" , 1, "@" , HB_PP_TOKEN_REFERENCE | HB_PP_TOKEN_STATIC },
{ "(" , 1, "(" , HB_PP_TOKEN_LEFT_PB | HB_PP_TOKEN_STATIC },
{ ")" , 1, ")" , HB_PP_TOKEN_RIGHT_PB | HB_PP_TOKEN_STATIC },
@@ -884,7 +889,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState )
snprintf( szFunc, sizeof( szFunc ), "HB_INLINE_%03d", ++pState->iInLineCount );
if( pInLinePtr && * pInLinePtr )
hb_pp_tokenSetValue( *pInLinePtr, szFunc, strlen( szFunc ) );
pState->pInLineFunc( pState->cargo, szFunc,
pState->pInLineFunc( pState->cargo, szFunc,
hb_membufPtr( pState->pStreamBuffer ),
hb_membufLen( pState->pStreamBuffer ),
pState->iDumpLine );
@@ -1051,7 +1056,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState )
while( ++ul < ulLen && HB_PP_ISNEXTIDCHAR( pBuffer[ ul ] ) );
/*
* In Clipper note can be used only as 1-st token and after
* In Clipper note can be used only as 1-st token and after
* statement separator ';' it does not work like a single line
* comment.
*/
@@ -1229,7 +1234,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState )
}
while( ( pState->pFile->pLineBuf ? pState->pFile->ulLineBufLen != 0 :
!pState->pFile->fEof ) &&
( pState->fCanNextLine ||
( pState->fCanNextLine ||
( pState->iStreamDump && pState->iStreamDump != HB_PP_STREAM_CLIPPER ) ) );
if( pState->iStreamDump )
@@ -1383,7 +1388,7 @@ static BOOL hb_pp_tokenEqual( PHB_PP_TOKEN pToken, PHB_PP_TOKEN pMatch,
USHORT mode )
{
return pToken == pMatch ||
( mode != HB_PP_CMP_ADDR &&
( mode != HB_PP_CMP_ADDR &&
HB_PP_TOKEN_TYPE( pToken->type ) == HB_PP_TOKEN_TYPE( pMatch->type ) &&
( pToken->len == pMatch->len ||
( mode == HB_PP_CMP_DBASE && pMatch->len > 4 &&
@@ -1868,7 +1873,7 @@ static BOOL hb_pp_pragmaOperatorNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken )
pState->pOperators,
sizeof( HB_PP_OPERATOR ) * ( pState->iOperators + 1 ) );
else
pState->pOperators = ( PHB_PP_OPERATOR ) hb_xgrab(
pState->pOperators = ( PHB_PP_OPERATOR ) hb_xgrab(
sizeof( HB_PP_OPERATOR ) * ( pState->iOperators + 1 ) );
pOperator = &pState->pOperators[ pState->iOperators++ ];
pOperator->name = hb_strndup( pBuffer, ulLen );
@@ -2093,7 +2098,7 @@ static void hb_pp_pragmaNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken )
}
else if( hb_pp_tokenValueCmp( pToken, "EXITSEVERITY", HB_PP_CMP_DBASE ) )
{
pValue = hb_pp_pragmaGetLogical( pToken->pNext, &iValue );
pValue = hb_pp_pragmaGetInt( pToken->pNext, &iValue );
if( pValue )
fError = hb_pp_setCompilerSwitch( pState, "es", iValue );
else
@@ -2156,7 +2161,7 @@ static void hb_pp_pragmaNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken )
}
else if( hb_pp_tokenValueCmp( pToken, "WARNINGLEVEL", HB_PP_CMP_DBASE ) )
{
pValue = hb_pp_pragmaGetLogical( pToken->pNext, &iValue );
pValue = hb_pp_pragmaGetInt( pToken->pNext, &iValue );
if( pValue )
fError = hb_pp_setCompilerSwitch( pState, "w", iValue );
else
@@ -3051,7 +3056,7 @@ static BOOL hb_pp_tokenSkipExp( PHB_PP_TOKEN * pTokenPtr, PHB_PP_TOKEN pStop,
static BOOL hb_pp_tokenCanStartExp( PHB_PP_TOKEN pToken )
{
if( !HB_PP_TOKEN_NEEDLEFT( pToken->type ) )
if( !HB_PP_TOKEN_NEEDLEFT( pToken ) )
{
if( HB_PP_TOKEN_TYPE( pToken->type ) != HB_PP_TOKEN_LEFT_SB )
return TRUE;
@@ -3442,7 +3447,7 @@ static PHB_PP_TOKEN * hb_pp_matchResultLstAdd( PHB_PP_STATE pState,
}
else
{
/* leading spaces calculation in Clipper is broken when
/* leading spaces calculation in Clipper is broken when
separate tokens are stringified, it can be quite
easy checked that it will interact with translation
done just before - spaces are partially inherited.
@@ -3890,8 +3895,8 @@ static PHB_PP_TOKEN hb_pp_calcPrecedence( PHB_PP_TOKEN pToken,
}
break;
case HB_PP_TOKEN_AMPERSAND:
/* It will not work because && will be stripped as comment */
*piNextPrec = HB_PP_PREC_BIT;
/* It will not work because && will be stripped as comment */
if( pNext && HB_PP_TOKEN_TYPE( pNext->type ) == HB_PP_TOKEN_AMPERSAND &&
pNext->spaces == 0 )
{
@@ -3903,6 +3908,12 @@ static PHB_PP_TOKEN hb_pp_calcPrecedence( PHB_PP_TOKEN pToken,
*piNextPrec = HB_PP_PREC_BIT;
break;
case HB_PP_TOKEN_BITXOR:
case HB_PP_TOKEN_SHIFTL:
case HB_PP_TOKEN_SHIFTR:
*piNextPrec = HB_PP_PREC_BIT;
break;
/* math plus/minus */
case HB_PP_TOKEN_PLUS:
case HB_PP_TOKEN_MINUS:
@@ -3963,8 +3974,15 @@ static HB_LONG hb_pp_calcOperation( HB_LONG lValueLeft, HB_LONG lValueRight,
lValueLeft &= lValueRight;
break;
case HB_PP_TOKEN_POWER:
case HB_PP_TOKEN_BITXOR:
lValueLeft ^= lValueRight;
break;
case HB_PP_TOKEN_SHIFTL:
lValueLeft <<= lValueRight;
break;
case HB_PP_TOKEN_SHIFTR:
lValueLeft >>= lValueRight;
break;
case HB_PP_TOKEN_PLUS:
lValueLeft += lValueRight;
@@ -4653,9 +4671,17 @@ void hb_pp_initDynDefines( PHB_PP_STATE pState )
hb_pp_addDefine( pState, szDefine, szResult );
#endif
/* __HARBOUR__ */
#if defined( __HARBOUR__ ) || defined( __XHARBOUR__ )
snprintf( szResult, sizeof( szResult ), "%05d", HB_MAX( ( HB_VER_MAJOR << 8 ) | HB_VER_MINOR, 1 ) );
#ifdef __HARBOUR__
/* __HARBOUR__ */
hb_pp_addDefine( pState, "__HARBOUR__", szResult );
#endif
#ifdef __XHARBOUR__
/* __XHARBOUR__ */
hb_pp_addDefine( pState, "__XHARBOUR__", szResult );
#endif
#endif
/* __DATE__ */
hb_dateToday( &iYear, &iMonth, &iDay );
@@ -4876,7 +4902,7 @@ void hb_pp_addDefine( PHB_PP_STATE pState, char * szDefName, char * szDefValue )
{
hb_pp_tokenListFree( &pMatch );
hb_pp_tokenListFree( &pResult );
}
}
else
{
hb_pp_defineAdd( pState, HB_PP_CMP_CASE, 0, NULL, pMatch, pResult );
@@ -4957,7 +4983,7 @@ char * hb_pp_nextLine( PHB_PP_STATE pState, ULONG * pulLen )
/* only single command in one call */
if( !pState->pTokenOut->pNext )
break;
ltype = pState->iLastType;
ltype = HB_PP_TOKEN_TYPE( pToken->type );
}
if( fError )
pState->fError = TRUE;
@@ -5003,7 +5029,7 @@ char * hb_pp_parseLine( PHB_PP_STATE pState, char * pLine, ULONG * pulLen )
if( pState->fError )
fError = TRUE;
hb_pp_tokenStr( pToken, pState->pOutputBuffer, TRUE, TRUE, ltype );
ltype = pState->iLastType;
ltype = HB_PP_TOKEN_TYPE( pToken->type );
}
if( fError )
pState->fError = TRUE;