diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 6d3aecee49..8fa2eb48a4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,38 @@ +2000-08-08 18:05 UTC+0100 Ryszard Glab + + *include/hberrors.h + *source/compiler/hbgenerr.c + * added error: CASE or OTHERWISE does not match DO CASE" + if CASE or OTHERWISE is used outside of DO CASE/ENDCASE + + *source/compiler/harbour.l + * cleaned or fixed many rules + * fixed support for [] string delimiters + * fixed support for DO fun WITH (expr) + * see changes in harbour.y + + *source/compiler/harbour.y + *moved here rules for: + | OPTIONAL + | LOOP + | EXIT + | IN + | EXTERN + | ANNOUNCE + | LOCAL + | MEMVAR + | STATIC + | PRIVATE + | PUBLIC + | PARAMETERS + | PROCREQ + These keywords are treated simmilar to IDENTIFIER (they should + fill yyval.string member) + The generated code is much smaller and faster. + +NOTE: + Ron, this breaks harbour.slx rules !!! + 2000-08-08 12:11 GMT+2 Maurilio Longo * source/common/hbver.c ! fixed Operating System/2 version report (broken since it wasn't taking into account that from OS/2 3.x version diff --git a/harbour/include/hberrors.h b/harbour/include/hberrors.h index 1dc038fd90..dd66dc6908 100644 --- a/harbour/include/hberrors.h +++ b/harbour/include/hberrors.h @@ -90,6 +90,7 @@ extern "C" { #define HB_COMP_ERR_INVALID_SEND 43 #define HB_COMP_ERR_FUNC_ANNOUNCE 44 #define HB_COMP_ERR_JUMP_NOT_FOUND 45 +#define HB_COMP_ERR_CASE 46 #define HB_COMP_WARN_AMBIGUOUS_VAR 1 #define HB_COMP_WARN_MEMVAR_ASSUMED 2 diff --git a/harbour/source/compiler/harbour.l b/harbour/source/compiler/harbour.l index 18d69a9c2c..3068001572 100644 --- a/harbour/source/compiler/harbour.l +++ b/harbour/source/compiler/harbour.l @@ -114,11 +114,11 @@ FalseValue "."[f|n]"." Separator {SpaceTab} %x STRING1 STRING2 STRING3 -%x NEXT_ BREAK_ CASE_ DO_ WHILE_ WITH_ END_ EXIT_ EXTERNAL_ FIELD_ -%x FOR_ FUNCTION_ IIF_ IF_ IN_ INIT_ LOCAL_ LOOP_ -%x MEMVAR_ PARAM_ PRIVATE_ PUBLIC_ STATIC_ RETURN_ RECOVER_ -%x INVALIDNUM_ OTHERWISE_ PROCEDURE_ ANNOUNCE_ PROCREQ_ -%x DECLARE_ DECLARE_ID_ OPTIONAL_ +%x NEXT_ BREAK_ CASE_ DO_ WHILE_ WITH_ END_ FIELD_ +%x FOR_ FUNCTION_ IIF_ IF_ IN_ INIT_ +%x RETURN_ RECOVER_ +%x INVALIDNUM_ OTHERWISE_ PROCEDURE_ +%x DECLARE_ DECLARE_ID_ %% @@ -134,6 +134,8 @@ Separator {SpaceTab} (hb_comp_iState == IF) || (hb_comp_iState == ELSEIF) || (hb_comp_iState == CASE) || + (hb_comp_iState == BREAK) || + (hb_comp_iState == WITH) || (hb_comp_iState == WHILE) ) BEGIN STRING3; @@ -222,29 +224,11 @@ Separator {SpaceTab} %{ /* ************************************************************************ */ %} -"announce"|"announc"|"announ"|"annou"|"anno" { BEGIN ANNOUNCE_; +"announce"|"announc"|"announ"|"annou"|"anno" { + hb_comp_iState =IDENTIFIER; yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); + return ANNOUNCE; } -{Separator}+[_a-zA-Z] { /* an identifier after ANNOUNCE */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is the first item in the line */ - hb_comp_iState = ANNOUNCE; - return ANNOUNCE; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character after ANNOUNCE */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } %{ /* ************************************************************************ */ %} @@ -323,10 +307,13 @@ Separator {SpaceTab} unput( yytext[ yyleng-1 ] ); return IDENTIFIER; } -{Separator}*[\[] { /* array */ +{Separator}*[\[] { /* Clipper assumes a [String] here */ + if( hb_comp_wCaseCounter == 0 ) + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_CASE, NULL, NULL ); BEGIN 0; - /* Clipper does not like case[] at all */ - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, yytext, NULL ); + unput( yytext[ yyleng-1 ] ); + hb_comp_iState =CASE; + return CASE; } {Separator}*("+="|"-="|"->") { /* operators */ BEGIN 0; @@ -361,28 +348,10 @@ Separator {SpaceTab} %{ /* ************************************************************************ */ %} -"_procreq_" { BEGIN PROCREQ_; } -{Separator}+[_a-zA-Z] { /* an identifier after PROCREQ */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is the first item in the line */ - hb_comp_iState = PROCREQ; - return PROCREQ; - } - else - { /* there is another item in line already */ +"_procreq_" { yylval.string = hb_compIdentifierNew( "_PROCREQ_", TRUE ); hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character after PROCREQ */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - yylval.string = hb_compIdentifierNew( "_PROCREQ_", TRUE ); - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; + return PROCREQ; } %{ /* ************************************************************************ */ @@ -432,81 +401,13 @@ Separator {SpaceTab} %{ /* ************************************************************************ */ %} -"opti"|"optio"|"option"|"optiona"|"optional" { BEGIN OPTIONAL_; - yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - } -{Separator}+"with"{Separator}+[^ .] { /* DO OPTIONAL WITH ...*/ - BEGIN 0; - /* Push back the last character. */ - unput( yytext[ --yyleng ] ); - - /* Remove possible white space trailing the "with". */ - while( yytext[ yyleng - 1 ] < 48 ) - yyleng--; - - unput( ' ' ); - - /* Push back the "with". */ - unput( 'h' ); - unput( 't' ); - unput( 'i' ); - unput( 'w' ); - - yyleng -= 4; - yytext[ yyleng ] = 0; - - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } -{Separator}+"to"{Separator}+[^ .] { /* FOR nVar := OPTIONAL TO ...*/ - BEGIN 0; - /* Push back the last character. */ - unput( yytext[ --yyleng ] ); - - /* Remove possible white space trailing the "to". */ - while( yytext[ yyleng - 1 ] < 48 ) - yyleng--; - - unput( ' ' ); - - /* Push back the "to". */ - unput( 'o' ); - unput( 't' ); - - yyleng -= 2; - yytext[ yyleng ] = 0; - - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } - -{Separator}+[_a-zA-Z\&] { /* an Identifier after OPTIONAL */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - - /* OPTIONAL as first item on a line can't be a qualifier. */ - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } - else - { /* Now it should be a qalifier. */ - hb_comp_iState = OPTIONAL; - return OPTIONAL; - } - } -.|\n { /* any character (not identifier) after OPTIONAL */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } +"opti"|"optio"|"option"|"optiona"|"optional" { + yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); + return OPTIONAL; + } %{ /* ************************************************************************ */ %} - "do" BEGIN DO_; {Separator}+"case" { /* DO CASE statement */ BEGIN 0; @@ -643,71 +544,17 @@ Separator {SpaceTab} /* ************************************************************************ */ %} -"exit" { BEGIN EXIT_; } -{Separator}*[\n;] { /* EXIT last item in the line */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - if( hb_comp_wForCounter == 0 && hb_comp_wWhileCounter == 0 ) - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "EXIT", NULL ); - hb_comp_iState =EXITLOOP; - return EXITLOOP; - } - else - { /* there is another item in line already */ - yylval.string = hb_compIdentifierNew( "EXIT", TRUE ); +"exit" { hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -{Separator}+[fFpP] { /* FUNCTION or PROCEDURE after EXIT */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState =EXIT; return EXIT; - } - else - { /* there is another item in line already */ - yylval.string = hb_compIdentifierNew( "EXIT", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -{Separator}*. { /* any character (not identifier) after EXIT */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - yylval.string = hb_compIdentifierNew( "EXIT", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; } %{ /* ************************************************************************ */ %} -"exte"|"exter"|"extern"|"externa"|"external" { BEGIN EXTERNAL_; +"exte"|"exter"|"extern"|"externa"|"external" { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - } -{Separator}+[_a-zA-Z] { /* an identifier after the EXTERNAL */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { - hb_comp_iState =EXTERN; - return EXTERN; - } - else - { hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; + return EXTERN; } %{ /* ************************************************************************ */ @@ -860,27 +707,7 @@ Separator {SpaceTab} %{ /* ************************************************************************ */ %} -"in" BEGIN IN_; -{Separator}+[_a-zA-Z] { BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == IDENTIFIER ) - return IN; - else - { - yylval.string = hb_compIdentifierNew( "IN", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -{Separator}*[0-9] { BEGIN 0; - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, yytext, NULL ); - } -.|\n { BEGIN 0; - unput( yytext[ yyleng-1 ] ); - yylval.string = hb_compIdentifierNew( "IN", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } +"in" { hb_comp_iState =IDENTIFIER; return IN; } %{ /* ************************************************************************ */ %} @@ -900,7 +727,7 @@ Separator {SpaceTab} return IDENTIFIER; } } -.|\n { /* any character (not identifier) after EXIT */ +.|\n { /* any character (not identifier) after INIT */ BEGIN 0; unput( yytext[ yyleng-1 ] ); yylval.string = hb_compIdentifierNew( "INIT", TRUE ); @@ -911,84 +738,26 @@ Separator {SpaceTab} /* ************************************************************************ */ %} "#"{Separator}*"line" return LINE; +%{ +/* ************************************************************************ */ +%} "loca"|"local" { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - BEGIN LOCAL_; + hb_comp_iState =IDENTIFIER; + return LOCAL; } -{Separator}+[_a-zA-Z] { /* an identifier after LOCAL */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState =LOCAL; - return LOCAL; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after LOCAL */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } %{ /* ************************************************************************ */ %} -"loop" BEGIN LOOP_; -{Separator}*[\n;] { /* at the end of the line */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - if( hb_comp_wWhileCounter == 0 && hb_comp_wForCounter == 0 ) - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "LOOP", NULL ); - hb_comp_iState =LOOP; - return LOOP; - } - else - { /* there is another item in line already */ - yylval.string = hb_compIdentifierNew( "LOOP", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -{Separator}*. { /* any character (not LF) after LOOP */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - yylval.string = hb_compIdentifierNew( "LOOP", TRUE ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } +"loop" { hb_comp_iState =IDENTIFIER; return LOOP; } %{ /* ************************************************************************ */ %} -"memv"|"memva"|"memvar" { BEGIN MEMVAR_; +"memv"|"memva"|"memvar" { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); + hb_comp_iState =IDENTIFIER; + return MEMVAR; } -{Separator}+[_a-zA-Z] { /* an identifier after MEMVAR */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is the first item in the line */ - hb_comp_iState =MEMVAR; - return MEMVAR; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after MEMVAR */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } %{ /* ************************************************************************ */ %} @@ -1072,8 +841,10 @@ Separator {SpaceTab} unput( yytext[ yyleng-1 ] ); if( hb_comp_iState == LOOKUP ) { /* it is the first item in the line */ - hb_comp_iState = OTHERWISE; - return OTHERWISE; + if( hb_comp_wCaseCounter == 0 ) + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_CASE, NULL, NULL ); + hb_comp_iState = OTHERWISE; + return OTHERWISE; } else { /* there is another item in line already */ @@ -1092,54 +863,17 @@ Separator {SpaceTab} %} "para"|"param"|"parame"|"paramet"|"paramete"|"parameter"|"parameters" { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - BEGIN PARAM_; + hb_comp_iState =IDENTIFIER; + return PARAMETERS; } -{Separator}+[_a-zA-Z] { /* an identifier after PARAMETERS */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is the first item in the line */ - hb_comp_iState =PARAMETERS; - return PARAMETERS; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after PARAMETERS */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } %{ /* ************************************************************************ */ %} -"priv"("ate"|"at"|"a")? { BEGIN PRIVATE_; +"priv"("ate"|"at"|"a")? { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); + hb_comp_iState =IDENTIFIER; + return PRIVATE; } -{Separator}+[_a-zA-Z\&] { /* an Identifier after PRIVATE */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState =PRIVATE; - return PRIVATE; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after PRIVATE */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } %{ /* ************************************************************************ */ %} @@ -1157,28 +891,10 @@ Separator {SpaceTab} %{ /* ************************************************************************ */ %} -"publ"("ic"|"i")? { BEGIN PUBLIC_; +"publ"("ic"|"i")? { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - } -{Separator}+[_a-zA-Z\&] { /* an identifier after PUBLIC */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState =PUBLIC; - return PUBLIC; - } - else - { /* there is another item in line already */ - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after PUBLIC */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; + hb_comp_iState =IDENTIFIER; + return PUBLIC; } %{ /* ************************************************************************ */ @@ -1292,33 +1008,14 @@ Separator {SpaceTab} %} "stat"|"stati"|"static" { yylval.string = hb_compIdentifierNew( hb_strupr( yytext ), TRUE ); - BEGIN STATIC_; - } -{Separator}+[_a-zA-Z] { /* an identifier after STATIC */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - if( hb_comp_iState == LOOKUP ) - { /* it is first item in the line */ - hb_comp_iState = STATIC; - return STATIC; - } - else - { /* there is another item in line already */ - hb_comp_iState = IDENTIFIER; - return IDENTIFIER; - } - } -.|\n { /* any character (not identifier) after STATIC */ - BEGIN 0; - unput( yytext[ yyleng-1 ] ); - hb_comp_iState =IDENTIFIER; - return IDENTIFIER; + hb_comp_iState = IDENTIFIER; + return STATIC; } %{ /* ************************************************************************ */ %} -"step" return STEP; -"to" return TO; +"step" { hb_comp_iState = IDENTIFIER; return STEP; } +"to" { hb_comp_iState = IDENTIFIER; return TO; } %{ /* ************************************************************************ */ %} @@ -1398,18 +1095,13 @@ Separator {SpaceTab} return WITH; } } -{Separator}*[\)\(] { /* ( with ) or with() */ +{Separator}*[\)] { /* ( with ) or with() */ BEGIN 0; unput( yytext[ yyleng-1 ] ); hb_comp_iState =IDENTIFIER; yylval.string = hb_compIdentifierNew( "WITH", TRUE ); return IDENTIFIER; } -{Separator}*[\[] { /* array */ - /* Clipper does not like with[] at all */ - BEGIN 0; - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, yytext, NULL ); - } {Separator}*. { BEGIN 0; unput( yytext[ yyleng-1 ] ); @@ -1418,7 +1110,6 @@ Separator {SpaceTab} hb_comp_iState == MACROVAR || hb_comp_iState == MACROTEXT || hb_comp_iState == IDENTIFIER || - hb_comp_iState == LSEPARATOR || hb_comp_iState == RSEPARATOR ) { /* DO WITH */ hb_comp_iState =WITH; diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index 69c3f6d15b..70d41817ea 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -158,8 +158,8 @@ char * hb_comp_szAnnounce = NULL; /* ANNOUNCEd procedure */ %token LOCAL STATIC IIF IF ELSE ELSEIF END ENDIF LITERAL TRUEVALUE FALSEVALUE %token ANNOUNCE EXTERN INIT EXIT AND OR NOT PUBLIC EQ NE1 NE2 %token INC DEC ALIASOP DOCASE CASE OTHERWISE ENDCASE ENDDO MEMVAR -%token WHILE EXIT LOOP END FOR NEXT TO STEP LE GE FIELD IN PARAMETERS -%token PLUSEQ MINUSEQ MULTEQ DIVEQ POWER EXPEQ MODEQ EXITLOOP +%token WHILE LOOP END FOR NEXT TO STEP LE GE FIELD IN PARAMETERS +%token PLUSEQ MINUSEQ MULTEQ DIVEQ POWER EXPEQ MODEQ %token PRIVATE BEGINSEQ BREAK RECOVER RECOVERUSING DO WITH SELF LINE %token MACROVAR MACROTEXT %token AS_ARRAY AS_BLOCK AS_CHARACTER AS_CLASS AS_DATE AS_LOGICAL AS_NUMERIC AS_OBJECT AS_VARIANT DECLARE OPTIONAL @@ -382,7 +382,7 @@ Statement : ExecFlow CrlfStmnt { } ExtVarList { hb_compRTVariableGen( "__MVPRIVATE" ); hb_comp_cVarType = ' '; hb_comp_iVarScope = VS_NONE; } CrlfStmnt - | EXITLOOP { hb_comp_bDontGenLineNum = TRUE; hb_compLoopExit(); } CrlfStmnt { hb_comp_functions.pLast->bFlags |= FUN_BREAK_CODE; } + | EXIT { hb_comp_bDontGenLineNum = TRUE; hb_compLoopExit(); } CrlfStmnt { hb_comp_functions.pLast->bFlags |= FUN_BREAK_CODE; } | LOOP { hb_comp_bDontGenLineNum = TRUE; hb_compLoopLoop(); } CrlfStmnt { hb_comp_functions.pLast->bFlags |= FUN_BREAK_CODE; } | EXTERN ExtList Crlf | ANNOUNCE IdentName { @@ -420,6 +420,19 @@ ExtList : IdentName { hb_compExternAdd( $1 ); } IdentName : IDENTIFIER { $$ = $1; } | STEP { $$ = hb_compIdentifierNew( "STEP", TRUE ); } | TO { $$ = hb_compIdentifierNew( "TO", TRUE ); } + | OPTIONAL { $$ = $1; } + | LOOP { $$ = hb_compIdentifierNew( "LOOP", TRUE ); } + | EXIT { $$ = hb_compIdentifierNew( "EXIT", TRUE ); } + | IN { $$ = hb_compIdentifierNew( "IN", TRUE ); } + | EXTERN { $$ = $1; } + | ANNOUNCE { $$ = $1; } + | LOCAL { $$ = $1; } + | MEMVAR { $$ = $1; } + | STATIC { $$ = $1; } + | PRIVATE { $$ = $1; } + | PUBLIC { $$ = $1; } + | PARAMETERS { $$ = $1; } + | PROCREQ { $$ = $1; } ; /* Numeric values @@ -1750,7 +1763,7 @@ static void hb_compLoopLoop( void ) { if( ! hb_comp_pLoops ) { - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_EXIT_IN_SEQUENCE, "LOOP", NULL ); + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "LOOP", NULL ); } else { @@ -1792,7 +1805,7 @@ static void hb_compLoopExit( void ) { if( ! hb_comp_pLoops ) { - hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_EXIT_IN_SEQUENCE, "EXIT", NULL ); + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "EXIT", NULL ); } else { diff --git a/harbour/source/compiler/hbgenerr.c b/harbour/source/compiler/hbgenerr.c index 27c78b857c..75cf946ccf 100644 --- a/harbour/source/compiler/hbgenerr.c +++ b/harbour/source/compiler/hbgenerr.c @@ -85,6 +85,7 @@ char * hb_comp_szErrors[] = "Invalid selector in send: \'%s\'", "ANNOUNCEd procedure \'%s\' must be a public symbol", "Jump PCode not found", + "CASE or OTHERWISE does not match DO CASE", }; /* Table with parse warnings */