diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 832b849e7d..85e881fd49 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,16 @@ The license applies to all entries newer than 2009-04-28. */ +2010-12-08 12:20 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/src/compiler/complex.c + ! fixed condition used in some seldom places to convert expressions + inside square brackets [] to strings, i.e.: + FOR EACH c IN [abc] + ? c + NEXT + * keep Clipper restrictions for FUNCTION and PROCEDURE keywords + covered by -kc switch + 2010-12-06 22:53 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbhpdf/harupdf.ch + Added HPDF_PRINT_SCALING_NONE. diff --git a/harbour/src/compiler/complex.c b/harbour/src/compiler/complex.c index 4730c2e517..aeb1bb95c5 100644 --- a/harbour/src/compiler/complex.c +++ b/harbour/src/compiler/complex.c @@ -591,9 +591,11 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) case CASE: case BREAK: case RETURN: + case IN: case WITH: case WHILE: - case DECLARE_TYPE: + case DOSWITCH: + case WITHOBJECT: pLex->iState = LITERAL; hb_pp_tokenToString( pLex->pPP, pToken ); pLex->lasttok = hb_comp_tokenString( yylval_ptr, HB_COMP_PARAM, @@ -785,20 +787,15 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) { case FUNCTION: case PROCEDURE: - if( HB_SUPPORT_HARBOUR && ( pLex->iState != LOOKUP || - ( !HB_PP_TOKEN_ISEOC( pToken->pNext ) && - HB_PP_LEX_NEEDLEFT( pToken->pNext ) ) ) && - pLex->iState != INIT && pLex->iState != EXIT && - pLex->iState != STATIC ) + if( HB_SUPPORT_HARBOUR && + ( ( pLex->iState != LOOKUP && pLex->iState != STATIC && + pLex->iState != INIT && pLex->iState != EXIT ) || + HB_PP_TOKEN_ISEOC( pToken->pNext ) || + HB_PP_TOKEN_TYPE( pToken->pNext->type ) != HB_PP_TOKEN_KEYWORD ) ) { iType = IDENTIFIER; break; } - /* Clipper accepts FUNCTION and PROCEDURE in one context only */ - if( !pToken->pNext || - HB_PP_TOKEN_TYPE( pToken->pNext->type ) != HB_PP_TOKEN_KEYWORD ) - hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', - HB_COMP_ERR_SYNTAX, pToken->value, NULL ); pLex->iState = iType; return pLex->iState; @@ -810,7 +807,8 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) hb_strnicmp( "SEQUENCE", pToken->pNext->value, pToken->pNext->len ) == 0 ) { hb_pp_tokenGet( pLex->pPP ); - break; + pLex->iState = BEGINSEQ; + return BEGINSEQ; } } iType = IDENTIFIER; @@ -1207,7 +1205,8 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) } else if( pLex->iState == MACROVAR || pLex->iState == MACROTEXT || - pLex->iState == IDENTIFIER ) + pLex->iState == IDENTIFIER || + pLex->iState == BEGINSEQ ) { pLex->iState = WITH; return WITH; @@ -1221,7 +1220,8 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) ( !HB_SUPPORT_HARBOUR && HB_PP_TOKEN_ISEOC( pToken->pNext ) ) ) hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, "IIF", NULL ); - else if( HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB ) + else if( pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB ) { pLex->iState = IIF; return IIF; @@ -1230,7 +1230,7 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, pToken->pNext->value, NULL ); else - iType = IDENTIFIER; + iType = IDENTIFIER; break; case IF: @@ -1238,7 +1238,8 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) ( !HB_SUPPORT_HARBOUR && HB_PP_TOKEN_ISEOC( pToken->pNext ) ) ) hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, "IF", NULL ); - else if( HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB ) + else if( pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB ) { if( pLex->iState == LOOKUP ) { @@ -1355,9 +1356,8 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) iType = IDENTIFIER; break; - case EXIT: - case STATIC: - if( pLex->iState == LOOKUP ) + case IN: + if( pLex->iState == IDENTIFIER ) { pLex->iState = iType; return iType; @@ -1368,20 +1368,29 @@ int hb_comp_yylex( YYSTYPE *yylval_ptr, HB_COMP_DECL ) if( pLex->iState == DECLARE_TYPE ) iType = IDENTIFIER; break; - case IN: + + case EXIT: case LOOP: - case STEP: - case TO: + case LOCAL: + case STATIC: + case MEMVAR: + case PUBLIC: + case PRIVATE: + case PARAMETERS: + case EXTERN: + case DYNAMIC: case ANNOUNCE: + if( pLex->iState == LOOKUP ) + { + pLex->iState = iType; + return iType; + } + break; + + case TO: + case STEP: case OPTIONAL: case DESCEND: - case DYNAMIC: - case EXTERN: - case LOCAL: - case MEMVAR: - case PARAMETERS: - case PRIVATE: - case PUBLIC: break; } pLex->iState = IDENTIFIER;