diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c892883b57..978d0f563c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,13 @@ +2000-07-31 18:20 UTC+0800 Ron Pinkas + * source/compiler/harbour.slx + - Removed few redundant rules. + + Added logic to check for orphan LOOP, EXIT, or NEXT, and produce standard errors. + + Added check to check for &', &", or &[, and produce standard error. + + * source/macro/macro.slx + + Added logic to check for &', &", or &[, and produce standard error. + * Minor formating. + 2000-08-01 06:30 UTC+0700 Jose Lalin * source/compiler/hbgenerr.c Bug fixes as reported by Andi Jahja diff --git a/harbour/source/compiler/harbour.slx b/harbour/source/compiler/harbour.slx index 3bd99e6678..275ba7d8b3 100644 --- a/harbour/source/compiler/harbour.slx +++ b/harbour/source/compiler/harbour.slx @@ -267,6 +267,10 @@ LANGUAGE_WORDS_ARE { /* When 2 identifiers are correct syntax like in class declaration, we have to temporarily store the 2nd identifier. */ #define HB_ID_ON_HOLD -1050 +#define HB_MACRO_ERR -1051 +#define HB_CHK_NEXT -1052 +#define HB_CHK_EXIT -1053 +#define HB_CHK_LOOP -1054 /* Intermediate Reductions when still ambigious or need further reductions. */ #define _WHILE_WITH 3001 @@ -537,8 +541,6 @@ LANGUAGE_RULES_ARE { 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 , '\n' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( RETURN , ';' , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( RETURN , 0 , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( _INC_CR , 0 , 0 , 0 ) REDUCE_TO( INC , '\n' ), @@ -582,12 +584,10 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( NEXT , '[' , 0 , 0 ) REDUCE_TO( HB_NEXT_ID , '[' ), IF_SEQUENCE_IS( NEXT , '=' , 0 , 0 ) REDUCE_TO( HB_NEXT_ID , '=' ), IF_SEQUENCE_IS( NEXT , ':' , 0 , 0 ) REDUCE_TO( HB_NEXT_ID , ':' ), - IF_SEQUENCE_IS( NEXT , '\n' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( NEXT , ';' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( NEXT , 0 , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( NEXT , 0 , 0 , 0 ) REDUCE_TO( HB_CHK_NEXT , 0 ), - IF_SEQUENCE_IS( EXITLOOP , '\n' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( EXITLOOP , ';' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( EXITLOOP , '\n' , 0 , 0 ) REDUCE_TO( HB_CHK_EXIT , '\n' ), + IF_SEQUENCE_IS( EXITLOOP , ';' , 0 , 0 ) REDUCE_TO( HB_CHK_EXIT , ';' ), IF_SEQUENCE_IS( INIT , PROCEDURE , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( INIT , FUNCTION , 0 , 0 ) PASS_THROUGH(), @@ -600,8 +600,8 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( EXITLOOP , 0 , 0 , 0 ) REDUCE_TO( HB_EXIT_ID , 0 ), /* LOOP at BOL if followed by anything other the NEW LINE than Identifier else LOOP. */ - IF_SEQUENCE_IS( LOOP , '\n' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( LOOP , ';' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( LOOP , '\n' , 0 , 0 ) REDUCE_TO( HB_CHK_LOOP , '\n' ), + IF_SEQUENCE_IS( LOOP , ';' , 0 , 0 ) REDUCE_TO( HB_CHK_LOOP , ';' ), IF_SEQUENCE_IS( LOOP , '[' , 0 , 0 ) REDUCE_TO( HB_LOOP_ID , '[' ), IF_SEQUENCE_IS( LOOP , 0 , 0 , 0 ) REDUCE_TO( HB_LOOP_ID , 0 ), @@ -626,8 +626,6 @@ LANGUAGE_RULES_ARE { 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 , '\n' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( BREAK , ';' , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( BREAK , 0 , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( RECOVER , _USING_ , 0 , 0 ) REDUCE_TO( RECOVERUSING , 0 ), @@ -669,8 +667,6 @@ LANGUAGE_RULES_ARE { 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 , INC , 0 , 0 ) PASS_THROUGH(), /* Assume Pre of next */ - IF_SEQUENCE_IS( WHILE , DEC , 0 , 0 ) PASS_THROUGH(), /* Assume Pre of next */ IF_SEQUENCE_IS( WHILE , 0 , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( DO , _CASE_ , 0 , 0 ) REDUCE_TO( DOCASE , 0 ), @@ -690,8 +686,6 @@ LANGUAGE_RULES_ARE { 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 , INC , 0 , 0 ) PASS_THROUGH(), /* Assume Pre of next */ - IF_SEQUENCE_IS( CASE , DEC , 0 , 0 ) PASS_THROUGH(), /* Assume Pre of next */ IF_SEQUENCE_IS( CASE , 0 , 0 , 0 ) PASS_THROUGH(), /* This WITH is at BOL always IDENTIFIER. */ @@ -842,6 +836,10 @@ LANGUAGE_RULES_ARE { IF_SEQUENCE_IS( IDENTIFIER , IN , 0 , 0 ) PASS_THROUGH(), IF_SEQUENCE_IS( IN , '[' , 0 , 0 ) REDUCE_TO( HB_IN_ID , '[' ), IF_SEQUENCE_IS( IN , 0 , 0 , 0 ) REDUCE_TO( HB_IN_ID , 0 ), + + IF_SEQUENCE_IS( '&' , '\'' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR , 0 ), + IF_SEQUENCE_IS( '&' , '"' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR , 0 ), + IF_SEQUENCE_IS( '&' , '[' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR , 0 ) }; /* ------------------------------------------------- End of Language Definitions. ------------------------------------------------ */ @@ -1162,6 +1160,24 @@ int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], char asHold[][TOKEN_ x = LITERAL; break; + case HB_CHK_NEXT : + if( hb_comp_wForCounter == 0 ) + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_NEXTFOR, NULL, NULL ); + x = NEXT; + break; + + case HB_CHK_EXIT : + if( hb_comp_wForCounter == 0 && hb_comp_wWhileCounter == 0 ) + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "EXIT", NULL ); + x = EXITLOOP; + break; + + case HB_CHK_LOOP : + if( hb_comp_wForCounter == 0 && hb_comp_wWhileCounter == 0 ) + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_UNMATCHED_EXIT, "LOOP", NULL ); + x = LOOP; + break; + case HB_EXTERN_ID : strncpy( sIdentifier, "EXTERNAL", iWordLen ); sIdentifier[iWordLen] = '\0'; @@ -1444,6 +1460,11 @@ int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], char asHold[][TOKEN_ x = IDENTIFIER; break; + case HB_MACRO_ERR : + hb_compGenError( hb_comp_szErrors, 'E', HB_COMP_ERR_SYNTAX, "&", NULL ); + x = 0; + break; + default: printf( "No Handler for Custom Action %i\n", x ); } diff --git a/harbour/source/macro/macro.slx b/harbour/source/macro/macro.slx index 4999370e8d..1e1e914475 100644 --- a/harbour/source/macro/macro.slx +++ b/harbour/source/macro/macro.slx @@ -49,14 +49,12 @@ #define YY_DECL int yylex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) #define YYLEX_PARAM pMacro -/* code that fills input buffer - */ #undef YY_INPUT #define YY_INPUT( buf, result, max_size ) result = 0; #undef STREAM_EXCEPTION #define STREAM_EXCEPTION( sPair, cChar ) \ - hb_macroError( EG_SYNTAX, sPair ); \ + hb_macroError( EG_SYNTAX, YYLEX_PARAM ); \ aiReturn[ iReturn++ ] = '\n'; \ aiReturn[ iReturn++ ] = LITERAL; @@ -71,9 +69,7 @@ ACCEPT_TOKEN_AND_DROP_DELIMITER_IF_ONE_OF_THESE( " \t" ); ACCEPT_TOKEN_AND_RETURN_DELIMITER_IF_ONE_OF_THESE( "|,()[]{}^%*/+-:=!<>#@$" ); DELIMITER_BELONGS_TO_TOKEN_IF_ONE_OF_THESE( "" ); -/* Custom Action can be requested by setting reduction to LEX_CUSTOM_ACTION or lower. */ - -/* Intermediate Token needed to be expanded. */ +/* Intermediate Token, needs CustomAction. */ #define HB_LIT_ACT -1000 /* Stream Pairs. */ @@ -145,105 +141,103 @@ LANGUAGE_WORDS_ARE { #define HB_IIF_ID -1005 #define HB__FIELD_ID -1006 #define HB_QSELF_ID -1007 +#define HB_MACRO_ERR -1008 LANGUAGE_RULES_ARE { - IF_SEQUENCE_IS( '^' , 0 , 0 , 0 ) REDUCE_TO( POWER , 0 ), - IF_SEQUENCE_IS( '!' , 0 , 0 , 0 ) REDUCE_TO( NOT , 0 ), + IF_SEQUENCE_IS( '^' , 0 , 0 , 0 ) REDUCE_TO( POWER , 0 ), + IF_SEQUENCE_IS( '!' , 0 , 0 , 0 ) REDUCE_TO( NOT , 0 ), /* FIELD ALIASOP was removed because FIELD-> is still FIELD.*/ - IF_SEQUENCE_IS( FIELD , INASSIGN , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , INASSIGN ), - IF_SEQUENCE_IS( FIELD , INC , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , INC ), - IF_SEQUENCE_IS( FIELD , DEC , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , DEC ), - IF_SEQUENCE_IS( FIELD , PLUSEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , PLUSEQ ), - IF_SEQUENCE_IS( FIELD , MINUSEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MINUSEQ ), - IF_SEQUENCE_IS( FIELD , MULTEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MULTEQ ), - IF_SEQUENCE_IS( FIELD , DIVEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , DIVEQ ), - IF_SEQUENCE_IS( FIELD , EXPEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , EXPEQ ), - IF_SEQUENCE_IS( FIELD , MODEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MODEQ ), - IF_SEQUENCE_IS( FIELD , '(' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '(' ), - IF_SEQUENCE_IS( FIELD , '[' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '[' ), - IF_SEQUENCE_IS( FIELD , '=' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '=' ), - IF_SEQUENCE_IS( FIELD , ':' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , ':' ), - IF_SEQUENCE_IS( FIELD , '\n' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '\n' ), - IF_SEQUENCE_IS( FIELD , ';' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , ';' ), - IF_SEQUENCE_IS( FIELD , 0 , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( FIELD , INASSIGN , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , INASSIGN ), + IF_SEQUENCE_IS( FIELD , INC , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , INC ), + IF_SEQUENCE_IS( FIELD , DEC , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , DEC ), + IF_SEQUENCE_IS( FIELD , PLUSEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , PLUSEQ ), + IF_SEQUENCE_IS( FIELD , MINUSEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MINUSEQ ), + IF_SEQUENCE_IS( FIELD , MULTEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MULTEQ ), + IF_SEQUENCE_IS( FIELD , DIVEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , DIVEQ ), + IF_SEQUENCE_IS( FIELD , EXPEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , EXPEQ ), + IF_SEQUENCE_IS( FIELD , MODEQ , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , MODEQ ), + IF_SEQUENCE_IS( FIELD , '(' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '(' ), + IF_SEQUENCE_IS( FIELD , '[' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '[' ), + IF_SEQUENCE_IS( FIELD , '=' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '=' ), + IF_SEQUENCE_IS( FIELD , ':' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , ':' ), + IF_SEQUENCE_IS( FIELD , '\n' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '\n' ), + IF_SEQUENCE_IS( FIELD , ';' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , ';' ), + IF_SEQUENCE_IS( FIELD , 0 , 0 , 0 ) PASS_THROUGH(), /* This _FIELD_ is FIELD NOT at BOL wants only ->. */ - IF_SEQUENCE_IS( _FIELD_ , ALIASOP , 0 , 0 ) REDUCE_TO( FIELD , ALIASOP ), - IF_SEQUENCE_IS( _FIELD_ , '[' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '[' ), - IF_SEQUENCE_IS( _FIELD_ , 0 , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , 0 ), + IF_SEQUENCE_IS( _FIELD_ , ALIASOP , 0 , 0 ) REDUCE_TO( FIELD , ALIASOP ), + IF_SEQUENCE_IS( _FIELD_ , '[' , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , '[' ), + IF_SEQUENCE_IS( _FIELD_ , 0 , 0 , 0 ) REDUCE_TO( HB_FIELD_ID , 0 ), /* This _FIELD is _FIELD NOT at BOL wants only ->. */ - IF_SEQUENCE_IS( _FIELD , ALIASOP , 0 , 0 ) REDUCE_TO( FIELD , ALIASOP ), - IF_SEQUENCE_IS( _FIELD , '[' , 0 , 0 ) REDUCE_TO( HB__FIELD_ID , '[' ), - IF_SEQUENCE_IS( _FIELD , 0 , 0 , 0 ) REDUCE_TO( HB__FIELD_ID , 0 ), + IF_SEQUENCE_IS( _FIELD , ALIASOP , 0 , 0 ) REDUCE_TO( FIELD , ALIASOP ), + IF_SEQUENCE_IS( _FIELD , '[' , 0 , 0 ) REDUCE_TO( HB__FIELD_ID, '[' ), + IF_SEQUENCE_IS( _FIELD , 0 , 0 , 0 ) REDUCE_TO( HB__FIELD_ID, 0 ), /* Left Associate '[' to seperate from string delimiter. */ - IF_SEQUENCE_IS( IDENTIFIER , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( MACROVAR , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( MACROTEXT , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( ')' , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( ']' , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( '}' , '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( IDENTIFIER, '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( MACROVAR , '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( MACROTEXT , '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( ')' , '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( ']' , '[' , 0 , 0 ) PASS_THROUGH(), + IF_SEQUENCE_IS( '}' , '[' , 0 , 0 ) PASS_THROUGH(), - IF_SEQUENCE_IS( _DOT_DOT_ , 0 , 0 , 0 ) REDUCE_TO( HB_SELF_ID , ':' ), + IF_SEQUENCE_IS( _DOT_DOT_ , 0 , 0 , 0 ) REDUCE_TO( HB_SELF_ID , ':' ), - IF_SEQUENCE_IS( _SELF_ , ':' , 0 , 0 ) REDUCE_TO( SELF , ':' ), - IF_SEQUENCE_IS( _SELF_ , '[' , 0 , 0 ) REDUCE_TO( HB_SELF_ID , '[' ), - IF_SEQUENCE_IS( _SELF_ , 0 , 0 , 0 ) REDUCE_TO( HB_SELF_ID , 0 ), + IF_SEQUENCE_IS( _SELF_ , ':' , 0 , 0 ) REDUCE_TO( SELF , ':' ), + IF_SEQUENCE_IS( _SELF_ , '[' , 0 , 0 ) REDUCE_TO( HB_SELF_ID , '[' ), + IF_SEQUENCE_IS( _SELF_ , 0 , 0 , 0 ) REDUCE_TO( HB_SELF_ID , 0 ), - IF_SEQUENCE_IS( QSELF , '(' , ')' , 0 ) REDUCE_TO( SELF , 0 ), - IF_SEQUENCE_IS( QSELF , '[' , 0 , 0 ) REDUCE_TO( HB_QSELF_ID , '[' ), - IF_SEQUENCE_IS( QSELF , 0 , 0 , 0 ) REDUCE_TO( HB_QSELF_ID , 0 ), + IF_SEQUENCE_IS( QSELF , '(' , ')' , 0 ) REDUCE_TO( SELF , 0 ), + IF_SEQUENCE_IS( QSELF , '[' , 0 , 0 ) REDUCE_TO( HB_QSELF_ID , '[' ), + IF_SEQUENCE_IS( QSELF , 0 , 0 , 0 ) REDUCE_TO( HB_QSELF_ID , 0 ), - IF_SEQUENCE_IS( _IF_ , '(' , 0 , 0 ) REDUCE_TO( IIF , '(' ), - IF_SEQUENCE_IS( _IF_ , '[' , 0 , 0 ) REDUCE_TO( HB_IF_ID , '[' ), - IF_SEQUENCE_IS( _IF_ , 0 , 0 , 0 ) REDUCE_TO( HB_IF_ID , 0 ), + IF_SEQUENCE_IS( _IF_ , '(' , 0 , 0 ) REDUCE_TO( IIF , '(' ), + IF_SEQUENCE_IS( _IF_ , '[' , 0 , 0 ) REDUCE_TO( HB_IF_ID , '[' ), + IF_SEQUENCE_IS( _IF_ , 0 , 0 , 0 ) REDUCE_TO( HB_IF_ID , 0 ), - IF_SEQUENCE_IS( IIF , '(' , 0 , 0 ) PASS_THROUGH(), - 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( IIF , '(' , 0 , 0 ) PASS_THROUGH(), + 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( '&' , '\'' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR, 0 ), + IF_SEQUENCE_IS( '&' , '"' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR, 0 ), + IF_SEQUENCE_IS( '&' , '[' , 0 , 0 ) REDUCE_TO( HB_MACRO_ERR, 0 ) }; /* ------------------------------------------------- End of Language Definitions. ------------------------------------------------ */ -/* SimpLex Macros. */ - #undef LEX_CASE #define LEX_CASE(x) toupper(x) #ifdef SHOW_LEX_TOKENS #undef INTERCEPT_ACTION #define INTERCEPT_ACTION(x) \ - \ if( x == IDENTIFIER ) \ - printf( " IDENTIFIER = \"%s\"\n", yylval_ptr->string ); \ + printf( " IDENTIFIER = \"%s\"\n", yylval_ptr->string ); \ else if( x == LITERAL ) \ - printf( " LITERAL = \"%s\"\n", yylval_ptr->string ); \ + printf( " LITERAL = \"%s\"\n", yylval_ptr->string ); \ else if( x == MACROVAR ) \ - printf( " MACROVAR = \"%s\"\n", yylval_ptr->string ); \ + printf( " MACROVAR = \"%s\"\n", yylval_ptr->string ); \ else if( x == MACROTEXT ) \ - printf( " MACROTEXT = \"%s\"\n", yylval_ptr->string ); \ + printf( " MACROTEXT = \"%s\"\n", yylval_ptr->string ); \ else if( x == NUM_LONG ) \ - printf( " INTEGER = %il\n", yylval_ptr->valLong.lNumber ); \ + printf( " INTEGER = %il\n", yylval_ptr->valLong.lNumber ); \ else if( x == NUM_DOUBLE ) \ - printf( " DOUBLE = %f\n", yylval_ptr->valDouble.dNumber ); \ + printf( " DOUBLE = %f\n", yylval_ptr->valDouble.dNumber ); \ else if( x < 256 ) \ - if( x == '\n' || x == ';' ) \ - printf( " NEW LINE %i\n", hb_comp_iLine - 1 ); \ - else \ - printf( " DELIMITER = \"%c\"\n", x ); \ + if( x == '\n' || x == ';' ) \ + printf( " NEW LINE %i\n", hb_comp_iLine - 1 ); \ + else \ + printf( " DELIMITER = \"%c\"\n", x ); \ else \ - printf( " TOKEN = %i\n", x ); + printf( " TOKEN = %i\n", x ); #endif -/* Support Functions implemented as macros for speed. */ - #undef ELEMENT_TOKEN #define ELEMENT_TOKEN(x)\ -\ - {\ - yytext = x;\ + { yytext = x;\ yyleng = strlen( yytext );\ \ if( *yytext == '_' || *yytext == '&' || isalpha( *yytext ) )\ @@ -299,12 +293,10 @@ LANGUAGE_RULES_ARE { }\ else\ {\ - DEBUG_INFO( printf( "Element \"%s\" is IDENTIFIER\n", yytext ) );\ -\ - if( strlen( yytext ) > HB_SYMBOL_NAME_LEN )\ + if( ( USHORT ) strlen( yytext ) > YYLEX_PARAM->uiNameLen )\ {\ - yytext[ HB_SYMBOL_NAME_LEN ] = '\0';\ - yyleng = HB_SYMBOL_NAME_LEN;\ + yytext[ YYLEX_PARAM->uiNameLen ] = '\0';\ + yyleng = YYLEX_PARAM->uiNameLen;\ }\ \ yylval_ptr->string = hb_strdup( yytext );\ @@ -313,23 +305,12 @@ LANGUAGE_RULES_ARE { }\ else\ {\ - DEBUG_INFO( printf( "Passing Element \"%s\" to CONVERT_NUMBER()\n", sToken ) );\ -\ CONVERT_NUMBER();\ -\ - DEBUG_INFO( printf( "Element \"%s\" is %i\n", sToken, iRet ) );\ - }\ - } + }\ + } #define CONVERT_NUMBER()\ -\ - if( yytext == NULL || *yytext == '\0' )\ - {\ - printf( "Invalid Token passed to CONVERT_NUMBER()\n" );\ - iRet = 0;\ - }\ - /* Hex Number */\ - else if( yytext[0] == '0' && yytext[1] == 'X' )\ + if( yytext[0] == '0' && yytext[1] == 'X' )\ {\ long lNumber = hb_lex_Hex2L( yytext + 2 );\ \ @@ -383,7 +364,7 @@ LANGUAGE_RULES_ARE { } #undef CUSTOM_ACTION - #define CUSTOM_ACTION(x) x = hb_lex_CustomAction(x, iWordLen, aiHold, asHold, &iHold, yylval_ptr ) + #define CUSTOM_ACTION(x) x = hb_lex_CustomAction(x, iWordLen, aiHold, asHold, &iHold, yylval_ptr, pMacro ) long hb_lex_Hex2L( char* sHex ) { @@ -421,53 +402,56 @@ long hb_lex_Hex2L( char* sHex ) return lSum; } -int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], char asHold[][TOKEN_SIZE], int *ptr_iHold, YYSTYPE *yylval_ptr ) +int hb_lex_CustomAction( int x, int iWordLen, int aiHold[], char asHold[][TOKEN_SIZE], int *ptr_iHold, YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) { char * sIdentifier; - DEBUG_INFO( printf( "Custom Action for %i\n", x ) ); - /* Resetting (prepairing). */ sIdentifier = (char*) hb_xgrab( iWordLen + 1 ); sIdentifier[0] = '\0'; switch ( x ) { - case HB_LIT_ACT :\ + case HB_LIT_ACT : yylval_ptr->string = hb_strdup( sPair ); x = LITERAL; break; - case HB_FIELD_ID :\ + case HB_FIELD_ID : strncpy( sIdentifier, "FIELD" , iWordLen ); sIdentifier[iWordLen] = '\0'; x = IDENTIFIER; break; - case HB__FIELD_ID :\ + case HB__FIELD_ID : strncpy( sIdentifier, "_FIELD" , iWordLen ); sIdentifier[iWordLen] = '\0'; x = IDENTIFIER; break; - case HB_SELF_ID :\ + case HB_SELF_ID : strcpy( sIdentifier, "SELF" ); sIdentifier[4] = '\0'; x = IDENTIFIER; break; - case HB_IF_ID :\ + case HB_IF_ID : strcpy( sIdentifier, "IF" ); sIdentifier[2] = '\0'; x = IDENTIFIER; break; - case HB_IIF_ID :\ + case HB_IIF_ID : strcpy( sIdentifier, "IIF" ); sIdentifier[3] = '\0'; x = IDENTIFIER; break; + case HB_MACRO_ERR : + hb_macroError( EG_SYNTAX, YYLEX_PARAM ); + x = 0; + break; + default: printf( "No Handler for Custom Action %i\n", x ); }