2000-07-31 18:20 UTC+0800 Ron Pinkas <ron@profit-master.com>
* 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.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
2000-07-31 18:20 UTC+0800 Ron Pinkas <ron@profit-master.com>
|
||||
* 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 <dezac@corevia.com>
|
||||
* source/compiler/hbgenerr.c
|
||||
Bug fixes as reported by Andi Jahja
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user