See ChangeLog: 19990507-07:25 <rglab@imid.med.pl>

This commit is contained in:
Ryszard Glab
1999-05-07 06:19:59 +00:00
parent f41f52e008
commit 0fb8020f40
4 changed files with 185 additions and 50 deletions

View File

@@ -1,13 +1,12 @@
%{
/*
* $Id$
*
* Harbour lex rules.
* Build 21: Spring 99
* Usage: flex -i -oyylex.c harbour.l
* Usage: flex -i -8 -oyylex.c harbour.l
* You may find flex.exe at www.harbour-project.org
*/
*/
#include <stdio.h>
#include <stdlib.h>
@@ -52,9 +51,7 @@ long lNumber = 0;
#define LOOKUP 0
int _iState = LOOKUP;
/*
//Separator {SpaceTab}|("/ *".*"* /")|"//".*
*/
//Comment1 "/*"((.*)|(\n))"*/"
%}
@@ -66,14 +63,15 @@ Identifier (([a-zA-Z])|([_a-zA-Z][_a-zA-Z0-9]+))
String (\"(([^\"]*)|([\!]*))\")|(\'(([^\']*)|([\!]*))\')
PseudoFunc {Identifier}"("+.*")"+
Comment1 [\/][\*]([^\*]|[\*][^\/])*[\*][\/]
Comment1 "/*"([^\*]|("*"[^\/]))*"*/"
Comment2 [\/][\/].*
Comment ({Comment1}|{Comment2})
Separator {SpaceTab}|{Comment}
LineCont (;.*\n)
Separator {SpaceTab}|{Comment}|{LineCont}
%x COMMENT3 DEFINE DEFINE_PARAMS DEFINE_EXPR
%x IFDEF IFNDEF STRING1 STRING2
%x _NEXT
%x NEXT_ BREAK_
%%
@@ -141,9 +139,36 @@ Separator {SpaceTab}|{Comment}
\n.* _iState=LOOKUP; yyless( 1 ); ++iLine; if( ! _iQuiet ) printf( "\rline: %i", iLine ); return '\n';
;\n _iState=LOOKUP; ++iLine; if( ! _iQuiet ) printf( "\rline: %i", iLine );
"begin" return BEGINSEQ;
"break" _iState =BREAK; return BREAK;
"case" _iState =CASE; return CASE;
"begin"{Separator}+"sequ"("ence"|"enc"|"en"|"e")? return BEGINSEQ;
"break" BEGIN BREAK_;
<BREAK_>{Separator}*\n { /* at the end of line */
BEGIN 0;
unput( yytext[ yyleng-1 ] );
if( _iState == LOOKUP )
{ /* it is first item in the line */
return BREAK;
}
else
{ /* there is another item in line already */
yylval.string = "BrEaK";
return IDENTIFIER;
}
}
<BREAK_>{Separator}*[^_a-zA-Z] { /* there is no identifier after "break" */
BEGIN 0;
yylval.string = ((yytext[ yyleng-1 ] =='(')?"BREAK":"BrEaK");
_iState =IDENTIFIER;
unput( yytext[ yyleng-1 ] );
return IDENTIFIER;
}
<BREAK_>{Separator}*. { /* an identifier follows BREAK statement */
BEGIN 0;
unput( yytext[ yyleng-1 ] );
_iState =BREAK;
return BREAK;
}
<BREAK_>. { BEGIN 0; unput( yytext[ yyleng-1 ] ); }
"case" return CASE;
"do" return DO;
"do"{SpaceTab}+"case" return DOCASE;
("do"{SpaceTab}+"while")|"while" return WHILE;
@@ -153,12 +178,13 @@ Separator {SpaceTab}|{Comment}
"endif" return ENDIF;
"endcase" return ENDCASE;
"enddo" return ENDDO;
"end"{Separator}+"sequ"("ence"|"enc"|"en"|"e")? return END;
"exit"/[\n\;] return EXITLOOP;
"exit" return EXIT;
"extern"|"external" _iState =EXTERN; return EXTERN;
"field"/[^(] _iState =FIELD; return FIELD;
"for" _iState = FOR; return FOR;
"func"|"funct"|"functi"|"functio"|"function"/[^(] return FUNCTION;
"func"|"funct"|"functi"|"functio"|"function"/[^(] _iState=FUNCTION; return FUNCTION;
("if"|"iif"){SpaceTab}*/[(] _iState =IF; return IF;
"if" _iState =IF; return IF;
"in" return IN;
@@ -167,8 +193,8 @@ Separator {SpaceTab}|{Comment}
"local" _iState =LOCAL; return LOCAL;
"loop" return LOOP;
"memvar" _iState =MEMVAR; return MEMVAR;
"next" BEGIN _NEXT;
<_NEXT>{Separator}*[\n\;] { /* at the end of line */
"next" BEGIN NEXT_;
<NEXT_>{Separator}*[\n\;] { /* at the end of line */
BEGIN 0;
if( _iState == LOOKUP )
{ /* it is first item in the line */
@@ -182,20 +208,20 @@ Separator {SpaceTab}|{Comment}
return IDENTIFIER;
}
}
<_NEXT>{Separator}*[^_a-zA-Z\n\;] { /* there is no identifier after "next" */
<NEXT_>{Separator}*[^_a-zA-Z\n\;] { /* there is no identifier after "next" */
BEGIN 0;
yylval.string = ((yytext[ yyleng-1 ] =='(')?"NEXT":"nExT");
unput( yytext[ yyleng-1 ] );
_iState =IDENTIFIER;
return IDENTIFIER;
}
<_NEXT>{Separator}*. { /* an identifier follows NEXT statement */
<NEXT_>{Separator}*. { /* an identifier follows NEXT statement */
BEGIN 0;
unput( yytext[ yyleng-1 ] );
_iState =NEXT;
return NEXT;
}
<_NEXT>. { BEGIN 0; unput( yytext[ yyleng-1 ] ); }
<NEXT_>. { BEGIN 0; unput( yytext[ yyleng-1 ] ); }
"nil" return NIL;
"otherwise" return OTHERWISE;
"parameters" _iState =PARAMETERS; return PARAMETERS;
@@ -205,7 +231,6 @@ Separator {SpaceTab}|{Comment}
"qself"{SpaceTab}*[(]{SpaceTab}*[)] return SELF;
"recover" _iState =RECOVER; return RECOVER;
"retu"|"retur"|"return" _iState =RETURN; return RETURN;
"sequence" return SEQUENCE;
"static" _iState =STATIC; return STATIC;
"step"/[^(] return STEP;
"to" return TO;
@@ -282,6 +307,8 @@ Separator {SpaceTab}|{Comment}
{String} yylval.string = strdup( yytext + 1 ); yylval.string[ yyleng - 2 ] = 0; return LITERAL;
{LineCont} { ++iLine; }
{Identifier} {
PDEFINE pDef = FindDef( yytext );
char * szText; int c;

View File

@@ -1,5 +1,4 @@
%{
/*
* $Id$
*
@@ -335,9 +334,14 @@ static const char * _szReservedFun[] = {
};
#define RESERVED_FUNCTIONS sizeof(_szReservedFun) / sizeof(char *)
/* function compares strings upto maximum 4 characters (used in bsearch) */
/* Borland C 3.1 reports error when this forward declaration is used
* int sz_compare4( const void *, const void * );
*
*/
/* Compare first 4 characters
* If they are the same then compare the whole name
* SECO() is not allowed because of Clipper function SECONDS()
* however SECO32() is a valid name.
*/
int sz_compare4( const void *pLookup, const void *pReserved )
{
@@ -385,7 +389,7 @@ PEXTERN pExterns = 0;
%token INC DEC ALIAS 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 PRIVATE BEGINSEQ BREAK RECOVER USING SEQUENCE DO WITH SELF
%token PRIVATE BEGINSEQ BREAK RECOVER USING DO WITH SELF
/*the lowest precedence*/
/*postincrement and postdecrement*/
@@ -493,6 +497,8 @@ Statement : ExecFlow Crlf {}
| ObjectData ArrayIndex '=' Expression Crlf {}
| ObjectMethod ArrayIndex '=' Expression Crlf {}
| BREAK Crlf
| BREAK Expression Crlf
| RETURN Crlf { GenReturn( Jump( 0 ) ); }
| RETURN Expression Crlf { GenPCode1( _RETVALUE ); GenReturn( Jump ( 0 ) ); }
| PUBLIC VarList Crlf
@@ -887,22 +893,14 @@ ForStatements : ForStat NEXT
ForStat : Statements { Line(); }
;
BeginSeq : BEGINSEQ SEQUENCE Crlf
BreakSeq
BeginSeq : BEGINSEQ Crlf
RecoverSeq
EndSeq
END
| BEGINSEQ SEQUENCE Crlf Statements
BreakSeq
| BEGINSEQ Crlf
Statements
RecoverSeq
EndSeq
;
BreakSeq : /* no break */
| BREAK Crlf
| BREAK Crlf Statements
| BREAK Expression Crlf
| BREAK Expression Crlf Statements
END
;
RecoverSeq : /* no recover */
@@ -912,10 +910,6 @@ RecoverSeq : /* no recover */
| RECOVER USING IDENTIFIER Crlf Statements
;
EndSeq : END
| END SEQUENCE
;
DoProc : DO IDENTIFIER { PushSymbol( $2, 1 ); PushNil(); Do( 0 ); }
| DO IDENTIFIER { PushSymbol( $2, 1 ); PushNil(); } WITH ArgList { Do( $5 ); }
;
@@ -982,6 +976,8 @@ int harbour_main( int argc, char * argv[] )
char *szPath ="";
FILENAME *pFileName =NULL;
printf( "Harbour compiler\nbuild %i Spring 1999\n", BUILD );
if( argc > 1 )
{
/* Command line options */
@@ -1090,9 +1086,6 @@ int harbour_main( int argc, char * argv[] )
iArg++;
}
if( ! _iQuiet )
printf( "Harbour compiler\nbuild %i Spring 1999\n", BUILD );
if( pFileName )
{
if( !pFileName->extension )
@@ -1582,8 +1575,11 @@ void FunDef( char * szFunName, char cScope ) /* stores a Clipper defined functi
}
pFunction =(char * *)RESERVED_FUNC( szFunName );
if( pFunction )
if( pFunction && !(functions.iCount==0 && !_iStartProc) )
{
/* We are ignoring it when it is the name of PRG file and we are
* not creating implicit starting procedure
*/
GenError( ERR_FUNC_RESERVED, *pFunction, szFunName );
}
@@ -1621,19 +1617,19 @@ void FunDef( char * szFunName, char cScope ) /* stores a Clipper defined functi
void GenJava( char *szFileName, char *szName )
{
printf( "\ngenerating Java language output...\n" );
printf( "%s -> not implemented yet!\n", szFileName );
printf( "%s -> not implemented yet! %s\n", szFileName, szName );
}
void GenPascal( char *szFileName, char *szName )
{
printf( "\ngenerating Pascal language output...\n" );
printf( "%s -> not implemented yet!\n", szFileName );
printf( "%s -> not implemented yet! %s\n", szFileName, szName );
}
void GenRC( char *szFileName, char *szName )
{
printf( "\ngenerating resources output...\n" );
printf( "%s -> not implemented yet!\n", szFileName );
printf( "%s -> not implemented yet! %s\n", szFileName, szName );
}
void GenCCode( char *szFileName, char *szName ) /* generates the C language output */
@@ -2477,7 +2473,7 @@ int GetLocalVarPos( char * szVarName ) /* returns the order + 1 of a variable if
}
/*
* Gets position of passed static variables.
* Gets position of passed static variables.
* All static variables are hold in a single array at runtime then positions
* are numbered for whole PRG module.
*/
@@ -3075,7 +3071,7 @@ int FieldsCount()
/*
* Start of definition of static variable
* We are using here the special function _pInitFunc which will store
* We are using here the special function _pInitFunc which will store
* pcode needed to initialize all static variables declared in PRG module.
* pOwner member will point to a function where the static variable is
* declared:
@@ -3105,7 +3101,7 @@ void StaticDefStart( void )
}
/*
/*
* End of definition of static variable
* Return to previously pcoded function.
*/

View File

@@ -165,7 +165,7 @@ BYTE bErrorLevel = 0; /* application exit errorlevel */
stack.Return.wType = IT_NIL;
StackInit();
NewDynSym( &symEval ); /* initialize dynamic symbol for evaluating codeblocks */
InitializeSets(); /* initialize Sets */
HB_init_set(); /* initialize Sets */
DoInitFunctions( argc, argv ); /* process defined INIT functions */
PushSymbol( pSymStart ); /* pushes first FS_PUBLIC defined symbol to the stack */

View File

@@ -0,0 +1,112 @@
//DO NOT RUN THIS PROGRAM - ITS PURPOSE IS THE SYNTAX CHECK ONLY!
STATIC nExt, bEgin, bReak
Function Main()
NEXT(nExt)
BEGIN( bEgin +';' + ; //////
";" ; /* ;;;;;just trying to be smart;;;;;;; */
)
BREAK_(bReak)
RETURN nil
/*================================================================
************************************************ Checking for NEXT
*/
FUNCTION NeXT( next_next/*next next*/ )
Local nExt, nExt7, nExtNEXT
For NExt := 1 To 10
OutStd( nExT ) // Actually this needs to use str()
Next /*next*/ nExt //next
//NEXT
nExt := 10 //next
nExt++ /*n_ext*/ //---
--nExt /*next*/
nExt7 :=7
nExtNEXT := nExt //next
nExt[ nExt ] := NEXT( nExt[nExt+nExt] * nExt *(nExt+nExt*5) )
IF( nExt > nExt+4 )
nExt =nExt +nExt * 5
ELSEIF( nExt > 0 )
nExt = nExt * 6 + nExt
ELSE
nExt +=5
ENDIF
RETURN( nExt * /*next*/ nExt )
/*===================================================================
* Checking for BEGIN
*/
FUNCTION BEGIN( BEGIN_BEGIN )
//LOCAL bEgin, xbEgin , bEginBEGIN , bEgin0, xbEginBEGIN:=100
LOCAL bEgin
LOCAL xbEgin
LOCAL bEginBEGIN
LOCAL bEgin0, /* BEGIN OF BEGIN */ ; /* begin */
bEgin1
LOCAL xbEginBEGIN := 100
BEGIN SEQUENCE
bEgin0 :=0
FOR bEgin:=1 TO 10
QOUT( bEgin )
xbEgin :=bEgin
bEginBEGIN :=xbEgin * 10
bEgin0 +=bEginBEGIN
--xbEginBEGIN
bEgin++
--bEgin
NEXT bEgin
bEgin :=BEGIN( xbegin +bEgin +bEginBEGIN -bEgin0 * xbEginBEGIN ) +;
bEgin[ bEgin ]
END SEQUENCE
BEGIN /* BEGIN */ SEQU
BEGIN_BEGIN :=bEgin//begin
END /* BEGIN */ SEQUENC
RETURN bEgin ^ 2
/*====================================================================
* Test for BREAK and BEGIN/RECOVER sequence
*/
FUNCTION BREAK_( break_break )
LOCAL bReak:=0
++bReak
IF( bReak = 0 )
Break /*break*/ ( nil )
BREAK /* break to beggining */
Break() //this line is not valid in Clipper: syntax error: ')'
ENDIF
Break /* break in break */ ;;;
; /////////////
()
begin sequence
FOR bReak:=1 To 10
QOut( bReak * bReak )
NEXT bReak
BREAK
bReak :=IIF( bReak=1, BREAK(0), BREAK(bReak) )
recover USING bReak
BREAK( Break( break() ) )
end
BREAK
RETURN bReak[ bReak ]