diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 9441e3373f..dec6bb0e96 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,17 @@ +2000-08-09 17:15 UTC+0800 Ron Pinkas + * source/compiler/simplex.c + * Minor improvements. + + * source/compiler/harbour.slx + - Removed un-needed cases in hb_lex_CustomAction() added by Ryszard. + - Removed 1 rule each for WHILE CASE BREAK and RETURN to default trailing '[' to string delimiter. + + * tests/keywords.prg + * Corrected few lines that had '[' as Array Index to String Delimiter after CASE, BREAK etc. + + /* Note keywords.prg should now be valid other than 3 (old) correct errors to do with FIELD*/ + SimpLex based harbour does compile it correctly Flex reports 26 incorrect errors. + 2000-08-09 15:30 UTC-0400 David G. Holm * source/pp/ppcore.c @@ -7,7 +21,7 @@ 2000-08-09 14:15 UTC+0100 Ryszard Glab *source/compiler/harbour.slx - * fixed to work with current syntax rules in harbour.y + * fixed to work with current syntax rules in harbour.y 2000-08-09 07:10 GMT-3 Luiz Rafael Culik *doc/en/sayget.txt diff --git a/harbour/source/compiler/harbour.slx b/harbour/source/compiler/harbour.slx index af5d014f34..f4e6f2ba52 100644 --- a/harbour/source/compiler/harbour.slx +++ b/harbour/source/compiler/harbour.slx @@ -140,23 +140,26 @@ SELF_CONTAINED_WORDS_ARE { #define HB_FIELD -1010 #define HB_PARAM -1011 #define HB_FOR -1012 +#define HB_OPTIONAL -1013 /* When 2 identifiers are correct syntax like in class declaration, we have to temporarily store the 2nd identifier. */ /* -#define HB_ID_ON_HOLD -1013 +#define HB_ID_ON_HOLD -1015 */ -#define HB_MACRO_ERR -1014 +#define HB_MACRO_ERR -1016 -#define HB_CHK_NEXT -1015 -#define HB_CHK_EXIT -1016 -#define HB_CHK_LOOP -1017 -#define HB_CHK_IN -1018 +#define HB_CHK_NEXT -1017 +#define HB_CHK_EXIT -1018 +#define HB_CHK_LOOP -1019 +#define HB_CHK_IN -1020 -#define HB_INIT_PROC -1019 -#define HB_EXIT_PROC -1020 -#define HB_INIT_FUNC -1021 -#define HB_EXIT_FUNC -1022 +#define HB_INIT_PROC -1021 +#define HB_EXIT_PROC -1022 +#define HB_INIT_FUNC -1023 +#define HB_EXIT_FUNC -1024 + +#define HB_RET_FUNID -1025 /* Key Words. */ LANGUAGE_KEY_WORDS_ARE { @@ -230,7 +233,7 @@ LANGUAGE_WORDS_ARE { LEX_WORD( "WHILE" ) AS_TOKEN( _WHILE_ ), LEX_WORD( "SEQUENCE" ) AS_TOKEN( _SEQUENCE_ ), LEX_WORD( "USING" ) AS_TOKEN( _USING_ ), - LEX_WORD( "OPTIONAL" ) AS_TOKEN( OPTIONAL ), + LEX_WORD( "OPTIONAL" ) AS_TOKEN( HB_OPTIONAL ), LEX_WORD( "NIL" ) AS_TOKEN( NIL ), LEX_WORD( "IIF" ) AS_TOKEN( IIF ), LEX_WORD( "TO" ) AS_TOKEN( TO ), @@ -363,7 +366,7 @@ LANGUAGE_RULES_ARE { /* Commands and Statements (Key Words only match at ). */ - IF_SEQUENCE_IS( FUNCTION , IDENTIFIER , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( FUNCTION , IDENTIFIER , 0 , 0 ) REDUCE_TO( HB_RET_FUNID , 0 ), IF_SEQUENCE_IS( FUNCTION , '[' , 0 , 0 ) REDUCE_TO( HB_FUNCTION_ID , '[' ), IF_SEQUENCE_IS( FUNCTION , 0 , 0 , 0 ) REDUCE_TO( HB_FUNCTION_ID , 0 ), @@ -501,7 +504,7 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( RETURN , DIVEQ , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , DIVEQ ), IF_SEQUENCE_IS( RETURN , EXPEQ , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , EXPEQ ), IF_SEQUENCE_IS( RETURN , MODEQ , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , MODEQ ), - IF_SEQUENCE_IS( RETURN , '[' , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , '[' ), + /* IF_SEQUENCE_IS( RETURN , '[' , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , '[' ), */ IF_SEQUENCE_IS( RETURN , '=' , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , '=' ), IF_SEQUENCE_IS( RETURN , ':' , 0 , 0 ) REDUCE_TO( HB_RETURN_ID , ':' ), IF_SEQUENCE_IS( RETURN , 0 , 0 , 0 ) PASS_THROUGH(), @@ -559,7 +562,7 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( BREAK , EXPEQ , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , EXPEQ ), IF_SEQUENCE_IS( BREAK , MODEQ , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , MODEQ ), IF_SEQUENCE_IS( BREAK , '(' , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , '(' ), - IF_SEQUENCE_IS( BREAK , '[' , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , '[' ), + /* IF_SEQUENCE_IS( BREAK , '[' , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , '[' ), */ IF_SEQUENCE_IS( BREAK , '=' , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , '=' ), IF_SEQUENCE_IS( BREAK , ':' , 0 , 0 ) REDUCE_TO( HB_BREAK_ID , ':' ), IF_SEQUENCE_IS( BREAK , 0 , 0 , 0 ) PASS_THROUGH(), @@ -603,8 +606,8 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( WHILE , DIVEQ , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , DIVEQ ), IF_SEQUENCE_IS( WHILE , EXPEQ , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , EXPEQ ), IF_SEQUENCE_IS( WHILE , MODEQ , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , MODEQ ), - /* IF_SEQUENCE_IS( WHILE , '(' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , '(' ), */ - IF_SEQUENCE_IS( WHILE , '[' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , '[' ), + /* IF_SEQUENCE_IS( WHILE , '(' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , '(' ), + IF_SEQUENCE_IS( WHILE , '[' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , '[' ), */ IF_SEQUENCE_IS( WHILE , '=' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , '=' ), IF_SEQUENCE_IS( WHILE , ':' , 0 , 0 ) REDUCE_TO( HB_WHILE_ID , ':' ), IF_SEQUENCE_IS( WHILE , 0 , 0 , 0 ) PASS_THROUGH(), @@ -626,8 +629,8 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( CASE , DIVEQ , 0 , 0 ) REDUCE_TO( HB_CASE_ID , DIVEQ ), IF_SEQUENCE_IS( CASE , EXPEQ , 0 , 0 ) REDUCE_TO( HB_CASE_ID , EXPEQ ), IF_SEQUENCE_IS( CASE , MODEQ , 0 , 0 ) REDUCE_TO( HB_CASE_ID , MODEQ ), - /* IF_SEQUENCE_IS( CASE , '(' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , '(' ), */ - IF_SEQUENCE_IS( CASE , '[' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , '[' ), + /* IF_SEQUENCE_IS( CASE , '(' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , '(' ), + IF_SEQUENCE_IS( CASE , '[' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , '[' ), */ IF_SEQUENCE_IS( CASE , '=' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , '=' ), IF_SEQUENCE_IS( CASE , ':' , 0 , 0 ) REDUCE_TO( HB_CASE_ID , ':' ), IF_SEQUENCE_IS( CASE , 0 , 0 , 0 ) PASS_THROUGH(), @@ -664,6 +667,25 @@ LANGUAGE_RULES_ARE { /* ---------------------- End of: DO WHILE; WHILE ; DO CASE ; CASE; DO ... ; DO ... WITH ------------------- */ + /* This IF is only at BOL if followed by operator (other than logicals .t., .f., !) than Identifier else IF. */ + IF_SEQUENCE_IS( IF , INASSIGN , 0 , 0 ) REDUCE_TO( HB_IF_ID , INASSIGN ), + IF_SEQUENCE_IS( IF , INC , '\n' , 0 ) REDUCE_TO( HB_IF_ID , _INC_CR ), + IF_SEQUENCE_IS( IF , INC , ';' , 0 ) REDUCE_TO( HB_IF_ID , _INC_SEMI ), + IF_SEQUENCE_IS( IF , DEC , '\n' , 0 ) REDUCE_TO( HB_IF_ID , _DEC_CR ), + IF_SEQUENCE_IS( IF , DEC , ';' , 0 ) REDUCE_TO( HB_IF_ID , _DEC_SEMI ), + IF_SEQUENCE_IS( IF , ALIASOP , 0 , 0 ) REDUCE_TO( HB_IF_ID , ALIASOP ), + IF_SEQUENCE_IS( IF , PLUSEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , PLUSEQ ), + IF_SEQUENCE_IS( IF , MINUSEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , MINUSEQ ), + IF_SEQUENCE_IS( IF , MULTEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , MULTEQ ), + IF_SEQUENCE_IS( IF , DIVEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , DIVEQ ), + IF_SEQUENCE_IS( IF , EXPEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , EXPEQ ), + IF_SEQUENCE_IS( IF , MODEQ , 0 , 0 ) REDUCE_TO( HB_IF_ID , MODEQ ), + /* IF_SEQUENCE_IS( IF , '(' , 0 , 0 ) REDUCE_TO( HB_IF_ID , '(' ), + IF_SEQUENCE_IS( IF , '[' , 0 , 0 ) REDUCE_TO( HB_IF_ID , '[' ), */ + IF_SEQUENCE_IS( IF , '=' , 0 , 0 ) REDUCE_TO( HB_IF_ID , '=' ), + IF_SEQUENCE_IS( IF , ':' , 0 , 0 ) REDUCE_TO( HB_IF_ID , ':' ), + IF_SEQUENCE_IS( IF , 0 , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( PROCREQ_ , '(' , 0 , 0 ) REDUCE_TO( PROCREQ , 0 ), IF_SEQUENCE_IS( PROCREQ_ , '[' , 0 , 0 ) REDUCE_TO( HB_PROCREQ_ID , '[' ), IF_SEQUENCE_IS( PROCREQ_ , 0 , 0 , 0 ) REDUCE_TO( HB_PROCREQ_ID , 0 ), @@ -699,50 +721,8 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( IIF , '[' , 0 , 0 ) REDUCE_TO( HB_IIF_ID , '[' ), IF_SEQUENCE_IS( IIF , 0 , 0 , 0 ) REDUCE_TO( HB_IIF_ID , 0 ), - IF_SEQUENCE_IS( OPTIONAL , _AS_ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , _AS_ ), - IF_SEQUENCE_IS( OPTIONAL , TO , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , TO ), - IF_SEQUENCE_IS( OPTIONAL , TRUEVALUE , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , TRUEVALUE ), - IF_SEQUENCE_IS( OPTIONAL , FALSEVALUE , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , FALSEVALUE ), - IF_SEQUENCE_IS( OPTIONAL , NOT , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , NOT ), - IF_SEQUENCE_IS( OPTIONAL , AND , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , AND ), - IF_SEQUENCE_IS( OPTIONAL , OR , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , OR ), - IF_SEQUENCE_IS( OPTIONAL , INASSIGN , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , INASSIGN ), - IF_SEQUENCE_IS( OPTIONAL , EQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , EQ ), - IF_SEQUENCE_IS( OPTIONAL , NE2 , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , NE2 ), - IF_SEQUENCE_IS( OPTIONAL , INC , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , INC ), - IF_SEQUENCE_IS( OPTIONAL , DEC , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , DEC ), - IF_SEQUENCE_IS( OPTIONAL , ALIASOP , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ALIASOP ), - IF_SEQUENCE_IS( OPTIONAL , LE , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , LE ), - IF_SEQUENCE_IS( OPTIONAL , GE , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , GE ), - IF_SEQUENCE_IS( OPTIONAL , PLUSEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , PLUSEQ ), - IF_SEQUENCE_IS( OPTIONAL , MINUSEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , MINUSEQ ), - IF_SEQUENCE_IS( OPTIONAL , MULTEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , MULTEQ ), - IF_SEQUENCE_IS( OPTIONAL , DIVEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , DIVEQ ), - IF_SEQUENCE_IS( OPTIONAL , POWER , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , POWER ), - IF_SEQUENCE_IS( OPTIONAL , EXPEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , EXPEQ ), - IF_SEQUENCE_IS( OPTIONAL , MODEQ , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , MODEQ ), - IF_SEQUENCE_IS( OPTIONAL , '!' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '!' ), - IF_SEQUENCE_IS( OPTIONAL , '<' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '<' ), - IF_SEQUENCE_IS( OPTIONAL , '>' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '>' ), - IF_SEQUENCE_IS( OPTIONAL , '(' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '(' ), - IF_SEQUENCE_IS( OPTIONAL , '[' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '[' ), - IF_SEQUENCE_IS( OPTIONAL , ']' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ']' ), - IF_SEQUENCE_IS( OPTIONAL , '-' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '-' ), - IF_SEQUENCE_IS( OPTIONAL , '+' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '+' ), - IF_SEQUENCE_IS( OPTIONAL , '*' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '*' ), - IF_SEQUENCE_IS( OPTIONAL , '/' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '/' ), - IF_SEQUENCE_IS( OPTIONAL , '^' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '^' ), - IF_SEQUENCE_IS( OPTIONAL , '%' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '%' ), - IF_SEQUENCE_IS( OPTIONAL , ':' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ':' ), - IF_SEQUENCE_IS( OPTIONAL , '=' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '=' ), - IF_SEQUENCE_IS( OPTIONAL , ',' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ',' ), - IF_SEQUENCE_IS( OPTIONAL , '$' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '$' ), - IF_SEQUENCE_IS( OPTIONAL , ')' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ')' ), - IF_SEQUENCE_IS( OPTIONAL , '}' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '}' ), - IF_SEQUENCE_IS( OPTIONAL , '|' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '|' ), - IF_SEQUENCE_IS( OPTIONAL , '\n' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , '\n' ), - IF_SEQUENCE_IS( OPTIONAL , ';' , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , ';' ), - IF_SEQUENCE_IS( OPTIONAL , 0 , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( OPTIONAL , IDENTIFIER , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( OPTIONAL , 0 , 0 , 0 ) REDUCE_TO( HB_OPTIONAL_ID , 0 ), IF_SEQUENCE_IS( '&' , '\'' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR , 0 ), IF_SEQUENCE_IS( '&' , '"' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR , 0 ), @@ -1165,6 +1145,14 @@ int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], int *ptr_iHold, BOOL x = 0; break; + case HB_OPTIONAL : + *ptr_bIgnoreWords = TRUE; + + aiHold[ (*ptr_iHold)++ ] = OPTIONAL; + + x = 0; + break; + case HB_CHK_NEXT : if( hb_comp_wForCounter == 0 ) hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_NEXTFOR, NULL, NULL ); @@ -1226,6 +1214,14 @@ int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], int *ptr_iHold, BOOL x = 0; break; + case HB_RET_FUNID : + /* iIdentifier++; */ + aiReturn[ (*ptr_iReturn)++ ] = IDENTIFIER; + aiReturn[ (*ptr_iReturn)++ ] = FUNCTION; + + x = 0; + break; + case HB_EXTERN_ID : strncpy( (char*) sIdentifier, "EXTERNAL", iWordLen ); sIdentifier[iWordLen] = '\0'; @@ -1441,66 +1437,6 @@ int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], int *ptr_iHold, BOOL sIdentifier[iWordLen] = '\0'; x = IDENTIFIER; break; - - case OPTIONAL : - strncpy( (char*) sIdentifier, "OPTIONAL" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case EXTERN : - strncpy( (char*) sIdentifier, "EXTERNAL" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case ANNOUNCE : - strncpy( (char*) sIdentifier, "ANNOUNCE" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case LOCAL : - strncpy( (char*) sIdentifier, "LOCAL" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case MEMVAR : - strncpy( (char*) sIdentifier, "MEMVAR" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case STATIC : - strncpy( (char*) sIdentifier, "STATIC" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case PRIVATE : - strncpy( (char*) sIdentifier, "PRIVATE" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case PUBLIC : - strncpy( (char*) sIdentifier, "PUBLIC" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case PARAMETERS : - strncpy( (char*) sIdentifier, "PARAMETERS" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; - - case PROCREQ : - strncpy( (char*) sIdentifier, "PROCREQ" , iWordLen ); - sIdentifier[iWordLen] = '\0'; - yylval.string = hb_compIdentifierNew( (char*) sIdentifier, TRUE ); - break; case HB_IN_ID : strcpy( (char*) sIdentifier, "IN" ); diff --git a/harbour/source/compiler/simplex.c b/harbour/source/compiler/simplex.c index f08a211ccf..9f76d6f996 100644 --- a/harbour/source/compiler/simplex.c +++ b/harbour/source/compiler/simplex.c @@ -317,6 +317,8 @@ int Reduce( int iToken, BOOL bReal ); { \ DEBUG_INFO( printf( "Reducing Self >%s<\n", sSelf ) ); \ \ + bIgnoreWords = FALSE;\ + \ if( bNewLine )\ {\ bNewLine = FALSE;\ @@ -443,10 +445,6 @@ int Reduce( int iToken, BOOL bReal ); {\ bNewLine = TRUE;\ }\ - else\ - {\ - bNewLine = FALSE;\ - }\ }\ \ DEBUG_INFO( printf( "Reducing Held: %i Pos: %i\n", iRet, iHold ) ); \ @@ -535,11 +533,18 @@ int Reduce( int iToken, BOOL bReal ); }\ else\ {\ - /* No longer a prospect. */\ - REMOVE_PROSPECT(iScan);\ + if( bReal )\ + {\ + /* No longer a prospect. */\ + REMOVE_PROSPECT(iScan);\ \ - /* Has to continue without increasing the counter, because of side effect of REMOVE_PROSPECT(). */\ - continue;\ + /* Has to continue without increasing the counter, because of side effect of REMOVE_PROSPECT(). */\ + continue;\ + }\ + else\ + {\ + iRemoved++;\ + }\ }\ \ iScan++;\ @@ -927,6 +932,8 @@ YY_DECL goto CheckToken ; } + bIgnoreWords = FALSE; + IF_BELONG_LEFT( chr ) { DEBUG_INFO( printf( "Reducing Left '%c'\n", chr ) ); @@ -1039,12 +1046,12 @@ YY_DECL sToken[ iLen ] = '\0'; DEBUG_INFO( printf( "Token: \"%s\" at Holding: \'%c\'\n", sToken, chr ) ); - goto CheckToken; } else { DEBUG_INFO( printf( "Reducing NewLine '%c'\n", chr ) ); + bIgnoreWords = FALSE; bNewLine = TRUE; RETURN_TOKEN( REDUCE( (int) chr ), NULL ); } @@ -1079,6 +1086,8 @@ YY_DECL { DEBUG_INFO( printf( "Reducing Delimiter: '%c'\n", chr ) ); + bIgnoreWords = FALSE; + if( bNewLine ) { bNewLine = FALSE; @@ -1244,6 +1253,8 @@ YY_DECL int Reduce( int iToken, BOOL bReal ) { + int iRemoved = 0; /* Simulted Removed Prospects if bReal is FALSE. */ + /* The search rutine will "return" the number of Matches in iFound, number of Prospects in iProspects, and the last (and hopefuly only) Matched Rule No in iReduce. */ @@ -1266,7 +1277,7 @@ int Reduce( int iToken, BOOL bReal ) if( ! bReal ) { - return ( iFound || iProspects ); + return ( iFound || ( iProspects - iRemoved ) ); } DEBUG_INFO( printf( "Found %i Rules and %i Prospects for Token %i After %i %i %i\n", iFound, iProspects, iToken, aiMatched[0], aiMatched[1], aiMatched[2] ) ); diff --git a/harbour/tests/keywords.prg b/harbour/tests/keywords.prg index b4e46cfab8..466a0f4a23 100644 --- a/harbour/tests/keywords.prg +++ b/harbour/tests/keywords.prg @@ -222,8 +222,11 @@ LOCAL case case ) NEXT case - case[ case ] :=case //in Clipper: Case is not immediatelly within DO CASE - case[ 2 ] :=2 //in Clipper: the same as above - Harbour compiles both + do case + case[ case ] == "case" + case[ 2 ] == "2" + endcase + case :=case[ 2 ] case =case + case - case case :={|case| case( case )} @@ -337,20 +340,26 @@ LOCAL with do->do :=while->while - while[ 1 ] :=while - while[ 2 ] +=2 + while[ 1 ] ==while + while[ 2 ] $ "2" + while( while ) + while( while[1] ) + while[ while ] == while[ 1 ] - while( while ) - while( while[1] ) - while[ while ] :=while[ 1 ] //in Clipper: syntax error ' 1 ' - while :={|while| while} + while :={|while| while} - while while++ < 10 - ( while )->( while() ) - enddo - enddo + enddo + enddo + enddo + + while while++ < 10 + ( while )->( while() ) + enddo + + enddo enddo + while while[1] //in Clipper: syntax error ' 1 ' enddo