ChangeLog 19990803-05:30

This commit is contained in:
Ryszard Glab
1999-08-03 03:39:24 +00:00
parent 9a7a4bc4f9
commit 974e40c0db
5 changed files with 86 additions and 32 deletions

View File

@@ -1,3 +1,20 @@
19990803-05:30 GMT+2 Ryszard Glab <rglab@imid.med.pl>
*tests/working/Makefile
+ added possibility to build a single file. Usage:
make PM=file
make PM=file.prg
PM can be replaced with pm
*source/compiler/harbour.y
* DO .. WITH .. statement passes variables by reference now
*source/vm/hvm.c
* added reporting of line numbers in some internal errors
*source/compiler/harbour.l
* corrected missed line continuation with BREAK; EXIT; and LOOP;
19990802-20:00 EDT David G. Holm <dholm@jsd-llc.com>
* config/os2/icc.cf
* Added '/NOE' to 'AR_FLAGS' to get rid of linker errors for

View File

@@ -226,7 +226,7 @@ Separator {SpaceTab}
/* ************************************************************************ */
%}
"break" BEGIN BREAK_;
<BREAK_>{Separator}*\n { /* at the end of line */
<BREAK_>{Separator}*[\n;] { /* at the end of line */
if( i_INDEX_STATE ) BEGIN INDEX; else BEGIN 0;
unput( yytext[ yyleng-1 ] );
if( _iState == LOOKUP )
@@ -444,7 +444,7 @@ Separator {SpaceTab}
%}
"exit" { BEGIN EXIT_; }
<EXIT_>{Separator}*[\n] { /* EXIT last item in the line */
<EXIT_>{Separator}*[\n;] { /* EXIT last item in the line */
unput( yytext[ yyleng-1 ] );
if( i_INDEX_STATE ) BEGIN INDEX; else BEGIN 0;
if( _iState == LOOKUP )
@@ -740,7 +740,7 @@ Separator {SpaceTab}
/* ************************************************************************ */
%}
"loop" BEGIN LOOP_;
<LOOP_>{Separator}*\n { /* at the end of the line */
<LOOP_>{Separator}*[\n;] { /* at the end of the line */
unput( yytext[ yyleng-1 ] );
if( i_INDEX_STATE ) BEGIN INDEX; else BEGIN 0;
if( _iState == LOOKUP )

View File

@@ -501,7 +501,7 @@ extern int _iState; /* current parser state (defined in harbour.l */
%type <dNum> DOUBLE
%type <iNumber> ArgList ElemList ExpList FunCall FunScope IncDec Logical Params ParamList
%type <iNumber> INTEGER BlockExpList Argument IfBegin VarId VarList MethParams ObjFunCall
%type <iNumber> MethCall BlockList FieldList DoArgList
%type <iNumber> MethCall BlockList FieldList DoArgList VarAt
%type <lNumber> INTLONG WhileBegin BlockBegin
%type <pVoid> IfElseIf Cases
@@ -581,7 +581,7 @@ Statement : ExecFlow Crlf {}
| IDENTIFIER '=' Expression Crlf { PopId( $1 ); }
| AliasVar '=' Expression Crlf { /* TODO */ GenPCode1( HB_P_POP ); }
| AliasFunc '=' Expression Crlf { --iLine; GenError( _szCErrors, 'E', ERR_INVALID_LVALUE, NULL, NULL ); }
| VarId ArrayIndex '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| VarAt '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| FunArrayCall '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| ObjectData '=' { MessageFix( SetData( $1 ) ); } Expression Crlf { Function( 1 ); GenPCode1( HB_P_POP ); }
| ObjectData ArrayIndex '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
@@ -635,7 +635,7 @@ MethParams : /* empty */ { $$ = 0; }
;
ObjectData : IdSend IDENTIFIER { $$ = $2; _lMessageFix = functions.pLast->lPCodePos; Message( $2 ); Function( 0 ); }
| VarId ArrayIndex ':' IDENTIFIER { GenPCode1( HB_P_ARRAYAT ); $$ = $4; _lMessageFix = functions.pLast->lPCodePos; Message( $4 ); Function( 0 ); }
| VarAt ':' IDENTIFIER { GenPCode1( HB_P_ARRAYAT ); $$ = $3; _lMessageFix = functions.pLast->lPCodePos; Message( $3 ); Function( 0 ); }
| ObjFunCall IDENTIFIER { $$ = $2; _lMessageFix = functions.pLast->lPCodePos; Message( $2 ); Function( 0 ); }
| ObjFunArray ':' IDENTIFIER { $$ = $3; _lMessageFix = functions.pLast->lPCodePos; Message( $3 ); Function( 0 ); }
| ObjectMethod ':' IDENTIFIER { $$ = $3; _lMessageFix = functions.pLast->lPCodePos; Message( $3 ); Function( 0 ); }
@@ -644,7 +644,7 @@ ObjectData : IdSend IDENTIFIER { $$ = $2; _lMessageFix = fun
;
ObjectMethod : IdSend IDENTIFIER { Message( $2 ); } '(' MethParams ')' { Function( $5 ); }
| VarId ArrayIndex ':' MethCall { Function( $4 ); GenPCode1( HB_P_ARRAYAT ); }
| VarAt ':' MethCall { Function( $3 ); GenPCode1( HB_P_ARRAYAT ); }
| ObjFunCall MethCall { Function( $2 ); }
| ObjFunArray ':' MethCall { Function( $3 ); }
| ObjectData ':' MethCall { Function( $3 ); }
@@ -749,8 +749,8 @@ AliasFunc : IDENTIFIER ALIAS '(' ExpList ')' {}
VarUnary : IDENTIFIER IncDec %prec POST { PushId( $1 ); Duplicate(); $2 ? Inc(): Dec(); PopId( $1 ); }
| IncDec IDENTIFIER %prec PRE { PushId( $2 ); $1 ? Inc(): Dec(); Duplicate(); PopId( $2 ); }
| VarId ArrayIndex IncDec %prec POST { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); $3 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); $3 ? Dec(): Inc(); }
| IncDec VarId ArrayIndex %prec PRE { DupPCode( $2 ); GenPCode1( HB_P_ARRAYAT ); $1 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt IncDec %prec POST { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); $2 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); $2 ? Dec(): Inc(); }
| IncDec VarAt %prec PRE { DupPCode( $2 ); GenPCode1( HB_P_ARRAYAT ); $1 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); }
| FunArrayCall IncDec %prec POST { GenPCode1( HB_P_DUPLTWO ); GenPCode1( HB_P_ARRAYAT ); $2 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); $2 ? Dec(): Inc(); }
| IncDec FunArrayCall %prec PRE { GenPCode1( HB_P_DUPLTWO ); GenPCode1( HB_P_ARRAYAT ); $1 ? Inc(): Dec(); GenPCode1( HB_P_ARRAYPUT ); }
| ObjectData IncDec %prec POST { MessageDupl( SetData( $1 ) ); Function( 0 ); $2 ? Inc(): Dec(); Function( 1 ); $2 ? Dec(): Inc(); }
@@ -766,14 +766,25 @@ IncDec : INC { $$ = 1; }
;
Variable : VarId {}
| VarId ArrayIndex { GenPCode1( HB_P_ARRAYAT ); }
| VarAt { GenPCode1( HB_P_ARRAYAT ); }
| FunArrayCall { GenPCode1( HB_P_ARRAYAT ); }
| ObjectData {}
| ObjectData ArrayIndex { GenPCode1( HB_P_ARRAYAT ); }
| ObjectMethod ArrayIndex { GenPCode1( HB_P_ARRAYAT ); }
;
VarId : IDENTIFIER { $$ = functions.pLast->lPCodePos; PushId( $1 ); }
VarId : IDENTIFIER { $$ = functions.pLast->lPCodePos;
if( _bForceByRefer && functions.pLast->szName )
/* DO .. WITH uses reference to a variable
* if not inside a codeblock
*/
PushIdByRef( $1 );
else
PushId( $1 );
}
;
VarAt : IDENTIFIER { $<iNumber>$ = functions.pLast->lPCodePos; PushId( $1 ); } ArrayIndex { $$ =$<iNumber>2; }
;
ArrayIndex : '[' IndexList ']'
@@ -791,13 +802,13 @@ VarAssign : IDENTIFIER INASSIGN Expression { PopId( $1 ); PushId( $1 ); }
| IDENTIFIER DIVEQ { PushId( $1 ); } Expression { GenPCode1( HB_P_DIVIDE ); PopId( $1 ); PushId( $1 ); }
| IDENTIFIER EXPEQ { PushId( $1 ); } Expression { GenPCode1( HB_P_POWER ); PopId( $1 ); PushId( $1 ); }
| IDENTIFIER MODEQ { PushId( $1 ); } Expression { GenPCode1( HB_P_MODULUS ); PopId( $1 ); PushId( $1 ); }
| VarId ArrayIndex INASSIGN Expression { GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex PLUSEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_PLUS ); GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex MINUSEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MINUS ); GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex MULTEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MULT ); GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex DIVEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_DIVIDE ); GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex EXPEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_POWER ); GenPCode1( HB_P_ARRAYPUT ); }
| VarId ArrayIndex MODEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MODULUS ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt INASSIGN Expression { GenPCode1( HB_P_ARRAYPUT ); }
| VarAt PLUSEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_PLUS ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt MINUSEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MINUS ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt MULTEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MULT ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt DIVEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_DIVIDE ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt EXPEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_POWER ); GenPCode1( HB_P_ARRAYPUT ); }
| VarAt MODEQ { DupPCode( $1 ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MODULUS ); GenPCode1( HB_P_ARRAYPUT ); }
| FunArrayCall INASSIGN Expression { GenPCode1( HB_P_ARRAYPUT ); }
| FunArrayCall PLUSEQ { GenPCode1( HB_P_DUPLTWO ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_PLUS ); GenPCode1( HB_P_ARRAYPUT ); }
| FunArrayCall MINUSEQ { GenPCode1( HB_P_DUPLTWO ); GenPCode1( HB_P_ARRAYAT ); } Expression { GenPCode1( HB_P_MINUS ); GenPCode1( HB_P_ARRAYPUT ); }
@@ -1109,6 +1120,12 @@ RecoverEmpty : RECOVER
RecoverUsing : RECOVER USING IDENTIFIER
;
/* NOTE: In Clipper all variables used in DO .. WITH are passed by reference
* however if they are part of an expression then they are passed by value
* for example:
* DO .. WITH ++variable
* will pass the value of variable not a reference
*/
DoProc : DO IDENTIFIER { PushSymbol( $2, 1 ); PushNil(); Do( 0 ); }
| DO IDENTIFIER { PushSymbol( $2, 1 ); PushNil(); _bForceByRefer=TRUE; } WITH DoArgList { Do( $5 ); _bForceByRefer=FALSE; }
| WHILE { PushSymbol( yy_strdup("WHILE"), 1 ); PushNil(); _bForceByRefer=TRUE; } WITH DoArgList { Do( $4 ); _bForceByRefer=FALSE; }

View File

@@ -725,7 +725,7 @@ void Do( WORD wParams )
if( ! IS_SYMBOL( pItem ) )
{
StackShow();
printf( "symbol item expected as a base from Do()\n" );
printf( "symbol item expected as a base from Do() in line %i\n", stack.pBase->item.asSymbol.lineno );
exit( 1 );
}
@@ -763,7 +763,7 @@ void Do( WORD wParams )
pFunc = pSym->pFunPtr;
if( ! pFunc )
{
printf( "error: invalid function pointer (%s) from Do()\n", pSym->szName );
printf( "error: invalid function pointer (%s) from Do() in line %i\n", pSym->szName, stack.pBase->item.asSymbol.lineno );
exit( 1 );
}
pFunc();
@@ -784,7 +784,7 @@ HARBOUR DoBlock( void )
if( ! IS_BLOCK( pBlock ) )
{
printf( "error: codeblock expected from DoBlock()\n" );
printf( "error: codeblock expected from DoBlock() in line %i\n", stack.pBase->item.asSymbol.lineno );
exit( 1 );
}
@@ -839,7 +839,7 @@ HARBOUR HB_EVAL( void )
}
else
{
printf( "Not a valid codeblock on eval\n" );
printf( "Not a valid codeblock on eval in line %i\n", stack.pBase->item.asSymbol.lineno );
exit( 1 );
}
}
@@ -1459,7 +1459,7 @@ long PopDate( void )
}
else
{
printf( "incorrect item value trying to Pop a date value\n" );
printf( "incorrect item value trying to Pop a date value in line %i\n", stack.pBase->item.asSymbol.lineno );
exit( 1 );
return 0;
}
@@ -1489,7 +1489,7 @@ double PopDouble( WORD *pwDec )
break;
default:
printf( "Incorrect item type trying to Pop a double\n" );
printf( "Incorrect item type trying to Pop a double in line %i\n", stack.pBase->item.asSymbol.lineno );
exit( 1 );
d = 0;
}
@@ -1569,7 +1569,8 @@ double PopNumber( void )
break;
default:
printf( "Incorrect item on the stack trying to pop a number\n" );
printf( "Incorrect item on the stack trying to pop a number in line %i\n", stack.pBase->item.asSymbol.lineno );
StackShow();
exit( 1 );
break;
}

View File

@@ -4,6 +4,17 @@
ROOT = ../../
LIBS=\
tools \
vm \
rtl \
rdd \
hbpp \
ifeq ($(PM),)
PM := $(pm)
endif
ifeq ($(PM),) # PM not defined = build all files
PRG_SOURCES=\
ainstest.prg \
and_or.prg \
@@ -147,11 +158,19 @@ C_HEADERS=\
BAD_C_SOURCES=\
extend2.c \
LIBS=\
tools \
vm \
rtl \
rdd \
hbpp \
include $(TOP)$(ROOT)config/test.cf
else #PM defined = build specified file
ifneq ($(findstring .prg,$(PM)),)
PRG_MAIN :=$(PM)
else
ifneq ($(findstring .PRG,$(PM)),)
PRG_MAIN := $(PM)
else
PRG_MAIN := $(PM).prg
endif
endif
include $(TOP)$(ROOT)config/bin.cf
endif