2007-07-02 18:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/source/macro/macro.yyc
  * harbour/source/macro/macro.y
  * harbour/source/macro/macrolex.c
    ! allow to use 'FIELD' and '_FIELD' as variable/function/field name.
    * allow to use 'IF' and 'IIF' as variable/field name.
This commit is contained in:
Przemyslaw Czerpak
2007-07-02 16:10:58 +00:00
parent 8cfbc435f7
commit b7a2da9dac
4 changed files with 65 additions and 13 deletions

View File

@@ -8,6 +8,13 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2007-07-02 18:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/macro/macro.yyc
* harbour/source/macro/macro.y
* harbour/source/macro/macrolex.c
! allow to use 'FIELD' and '_FIELD' as variable/function/field name.
* allow to use 'IF' and 'IIF' as variable/field name.
2007-07-02 17:16 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/common.mak
* harbour/source/rtl/Makefile

View File

@@ -917,13 +917,22 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro )
switch( HB_PP_TOKEN_TYPE( pToken->type ) )
{
case HB_PP_TOKEN_KEYWORD:
if( pToken->len >= 4 && pToken->len <= 6 &&
if( pToken->len >= 4 && pToken->len <= 6 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_ALIAS &&
( hb_strnicmp( "_FILED", pToken->value, pToken->len ) == 0 ||
hb_strnicmp( "FILED", pToken->value, pToken->len ) == 0 ) )
{
return FIELD;
else if( pToken->len == 3 && hb_stricmp( "IIF", pToken->value ) == 0 )
}
else if( pToken->len == 3 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB &&
hb_stricmp( "IIF", pToken->value ) == 0 )
{
return IIF;
else if( pToken->len == 2 && hb_stricmp( "IF", pToken->value ) == 0 )
}
else if( pToken->len == 2 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB &&
hb_stricmp( "IF", pToken->value ) == 0 )
return IIF;
else if( pToken->len == 3 && hb_stricmp( "NIL", pToken->value ) == 0 )
return NIL;

View File

@@ -3321,13 +3321,22 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro )
switch( HB_PP_TOKEN_TYPE( pToken->type ) )
{
case HB_PP_TOKEN_KEYWORD:
if( pToken->len >= 4 && pToken->len <= 6 &&
if( pToken->len >= 4 && pToken->len <= 6 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_ALIAS &&
( hb_strnicmp( "_FILED", pToken->value, pToken->len ) == 0 ||
hb_strnicmp( "FILED", pToken->value, pToken->len ) == 0 ) )
{
return FIELD;
else if( pToken->len == 3 && hb_stricmp( "IIF", pToken->value ) == 0 )
}
else if( pToken->len == 3 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB &&
hb_stricmp( "IIF", pToken->value ) == 0 )
{
return IIF;
else if( pToken->len == 2 && hb_stricmp( "IF", pToken->value ) == 0 )
}
else if( pToken->len == 2 && pToken->pNext &&
HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB &&
hb_stricmp( "IF", pToken->value ) == 0 )
return IIF;
else if( pToken->len == 3 && hb_stricmp( "NIL", pToken->value ) == 0 )
return NIL;

View File

@@ -111,6 +111,14 @@ void hb_macroLexDelete( HB_MACRO_PTR pMacro )
}
}
static void hb_lexSkipBlank( PHB_MACRO_LEX pLex )
{
while( pLex->ulSrc < pLex->ulLen &&
( pLex->pString[ pLex->ulSrc ] == ' ' ||
pLex->pString[ pLex->ulSrc ] == '\t' ) )
pLex->ulSrc++;
}
static void hb_lexIdentCopy( PHB_MACRO_LEX pLex )
{
while( pLex->ulSrc < pLex->ulLen )
@@ -615,14 +623,24 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro )
{
if( yylval_ptr->string[ 0 ] == 'I' &&
yylval_ptr->string[ 1 ] == 'F' )
return IIF;
{
hb_lexSkipBlank( pLex );
if( pLex->ulSrc < pLex->ulLen &&
pLex->pString[ pLex->ulSrc ] == '(' )
return IIF;
}
}
else if( ulLen == 3 )
{
if( yylval_ptr->string[ 0 ] == 'I' &&
yylval_ptr->string[ 1 ] == 'I' &&
yylval_ptr->string[ 2 ] == 'F' )
return IIF;
{
hb_lexSkipBlank( pLex );
if( pLex->ulSrc < pLex->ulLen &&
pLex->pString[ pLex->ulSrc ] == '(' )
return IIF;
}
else if( yylval_ptr->string[ 0 ] == 'N' &&
yylval_ptr->string[ 1 ] == 'I' &&
yylval_ptr->string[ 2 ] == 'L' )
@@ -635,21 +653,30 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro )
case '_':
if( ulLen <= 6 && memcmp( "FIELD", yylval_ptr->string + 1,
ulLen - 1 ) == 0 )
{
hb_lexSkipBlank( pLex );
if( pLex->ulSrc + 1 < pLex->ulLen &&
pLex->pString[ pLex->ulSrc ] == '-' &&
pLex->pString[ pLex->ulSrc + 1 ] == '>' )
return FIELD;
}
break;
case 'F':
if( ulLen <= 5 && memcmp( "IELD", yylval_ptr->string + 1,
ulLen - 1 ) == 0 )
{
hb_lexSkipBlank( pLex );
if( pLex->ulSrc + 1 < pLex->ulLen &&
pLex->pString[ pLex->ulSrc ] == '-' &&
pLex->pString[ pLex->ulSrc + 1 ] == '>' )
return FIELD;
}
break;
case 'Q':
if( ulLen == 5 && memcmp( "SELF", yylval_ptr->string + 1,
ulLen - 1 ) == 0 )
4 ) == 0 )
{
while( pLex->ulSrc < pLex->ulLen &&
( pLex->pString[ pLex->ulSrc ] == ' ' ||
pLex->pString[ pLex->ulSrc ] == '\t' ) )
pLex->ulSrc++;
hb_lexSkipBlank( pLex );
if( pLex->ulSrc < pLex->ulLen &&
pLex->pString[ pLex->ulSrc ] == '(' )
{