diff --git a/harbour/ChangeLog b/harbour/ChangeLog index edd2d37b04..e53223d305 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,14 @@ The license applies to all entries newer than 2009-04-28. */ +2012-10-24 20:31 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * harbour/src/compiler/complex.c + ! fixed lexer to correctly recognize ::msg as FOR iterator + + * harbour/include/hbexprb.c + ! fixed compile time GPF in code like: + QOut( @1-VAR ) + 2012-10-24 18:50 UTC+0200 Viktor Szakats (harbour syenar.net) * utils/hbmk2/hbmk2.1 * utils/hbmk2/hbmk2.es_PE.po diff --git a/harbour/include/hbexprb.c b/harbour/include/hbexprb.c index 58466a7cc8..7c6f277ae8 100644 --- a/harbour/include/hbexprb.c +++ b/harbour/include/hbexprb.c @@ -859,6 +859,7 @@ static HB_EXPR_FUNC( hb_compExprUseRef ) else if( pExp->ExprType == HB_ET_ALIASVAR ) { if( pExp->value.asAlias.pVar->ExprType == HB_ET_VARIABLE && + pExp->value.asAlias.pAlias->ExprType == HB_ET_ALIAS && hb_compExprIsMemvarAlias( pExp->value.asAlias.pAlias->value.asSymbol.name ) ) { /* @M-> @MEMVAR-> or @MEMVA-> or @MEMV-> */ HB_GEN_FUNC1( PushMemvarRef, pExp->value.asAlias.pVar->value.asSymbol.name ); @@ -1426,6 +1427,7 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt ) } else if( pList->ExprType == HB_ET_ALIASVAR && pList->value.asAlias.pVar->ExprType == HB_ET_VARIABLE && + pList->value.asAlias.pAlias->ExprType == HB_ET_ALIAS && hb_compExprIsMemvarAlias( pList->value.asAlias.pAlias->value.asSymbol.name ) ) { HB_GEN_FUNC1( PushMemvarRef, pList->value.asAlias.pVar->value.asSymbol.name ); @@ -1507,6 +1509,7 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt ) } else if( pList->ExprType == HB_ET_ALIASVAR && pList->value.asAlias.pVar->ExprType == HB_ET_VARIABLE && + pList->value.asAlias.pAlias->ExprType == HB_ET_ALIAS && hb_compExprIsMemvarAlias( pList->value.asAlias.pAlias->value.asSymbol.name ) ) { HB_GEN_FUNC1( PushMemvarRef, pList->value.asAlias.pVar->value.asSymbol.name ); diff --git a/harbour/src/compiler/complex.c b/harbour/src/compiler/complex.c index 9f7a90d1b4..0591a6e611 100644 --- a/harbour/src/compiler/complex.c +++ b/harbour/src/compiler/complex.c @@ -1038,23 +1038,26 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) case FOR: if( pLex->iState == LOOKUP && - !HB_PP_TOKEN_ISEOC( pToken->pNext ) && - ( HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_KEYWORD || - /* Clipper always assume FOR (somevar):=1 TO ... here */ - HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB ) ) + !HB_PP_TOKEN_ISEOC( pToken->pNext ) ) { - if( pToken->pNext->pNext && - HB_PP_TOKEN_TYPE( pToken->pNext->pNext->type ) != HB_PP_TOKEN_ASSIGN && - HB_PP_TOKEN_TYPE( pToken->pNext->pNext->type ) != HB_PP_TOKEN_EQ && - HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_KEYWORD && - hb_stricmp( "EACH", pToken->pNext->value ) == 0 ) + PHB_PP_TOKEN pNext = pToken->pNext; + + if( HB_PP_TOKEN_TYPE( pNext->type ) == HB_PP_TOKEN_KEYWORD && + pNext->pNext && + HB_PP_TOKEN_TYPE( pNext->pNext->type ) == HB_PP_TOKEN_KEYWORD && + hb_stricmp( "EACH", pNext->value ) == 0 ) { hb_pp_tokenGet( pLex->pPP ); pLex->iState = FOREACH; return FOREACH; } - pLex->iState = FOR; - return FOR; + if( !hb_pp_tokenNextExp( &pNext ) && pNext && + HB_PP_TOKEN_TYPE( pNext->type ) == HB_PP_TOKEN_KEYWORD && + hb_stricmp( "TO", pNext->value ) == 0 ) + { + pLex->iState = FOR; + return FOR; + } } iType = IDENTIFIER; break;