[Plib-cvs] plib/src/psl pslCodeGen.cxx,1.20,1.21 pslCompiler.cxx,1.20,1.21 pslCompiler.h,1.22,1.23 p
Brought to you by:
sjbaker
From: Steve B. <sj...@us...> - 2002-09-14 06:12:37
|
Update of /cvsroot/plib/plib/src/psl In directory usw-pr-cvs1:/tmp/cvs-serv6107/plib/src/psl Modified Files: pslCodeGen.cxx pslCompiler.cxx pslCompiler.h pslContext.cxx pslDump.cxx pslExpression.cxx pslOpcodes.h Log Message: Implemented ++ and -- Fixed locality of variables declared in 'for' loop scope. Index: pslCodeGen.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCodeGen.cxx,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- pslCodeGen.cxx 14 Sep 2002 05:32:16 -0000 1.20 +++ pslCodeGen.cxx 14 Sep 2002 06:12:32 -0000 1.21 @@ -103,6 +103,22 @@ pushCodeByte ( argpos ) ; } +void pslCompiler::pushIncrement ( const char *c ) +{ + int a = getVarSymbol ( c ) ; + + pushCodeByte ( OPCODE_INCREMENT ) ; + pushCodeByte ( a ) ; +} + +void pslCompiler::pushDecrement ( const char *c ) +{ + int a = getVarSymbol ( c ) ; + + pushCodeByte ( OPCODE_DECREMENT ) ; + pushCodeByte ( a ) ; +} + void pslCompiler::makeIntVariable ( const char *c ) { int a = getVarSymbol ( c ) ; Index: pslCompiler.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCompiler.cxx,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- pslCompiler.cxx 14 Sep 2002 05:32:16 -0000 1.20 +++ pslCompiler.cxx 14 Sep 2002 06:12:32 -0000 1.21 @@ -290,21 +290,31 @@ { char c [ MAX_TOKEN ] ; + pushLocality () ; pushBreakToLabel () ; int ct_lab = pushContinueToLabel () ; getToken ( c ) ; /* The initial '(' of the action */ if ( c [ 0 ] != '(' ) + { [...72 lines suppressed...] @@ -499,7 +522,9 @@ strcmp ( c, ">>=" ) != 0 ) { ungetToken ( c ) ; - pushFunctionCall ( var ) ; + ungetToken ( var ) ; + // pushFunctionCall ( var ) ; + pushExpression () ; pushPop () ; return TRUE ; } @@ -576,6 +601,8 @@ if ( strcmp ( c, "switch" ) == 0 ) return pushSwitchStatement () ; if ( strcmp ( c, "while" ) == 0 ) return pushWhileStatement () ; if ( strcmp ( c, "if" ) == 0 ) return pushIfStatement () ; + if ( strcmp ( c, "++" ) == 0 ) return pushAssignmentStatement ( c ) ; + if ( strcmp ( c, "--" ) == 0 ) return pushAssignmentStatement ( c ) ; if ( isalnum ( c [ 0 ] ) ) return pushAssignmentStatement ( c ) ; if ( c [ 0 ] == '{' ) return pushCompoundStatement () ; Index: pslCompiler.h =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslCompiler.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- pslCompiler.h 14 Sep 2002 05:32:16 -0000 1.22 +++ pslCompiler.h 14 Sep 2002 06:12:32 -0000 1.23 @@ -104,6 +104,9 @@ void pushGetParameter ( pslAddress var, int argpos ) ; + void pushIncrement ( const char *s ) ; + void pushDecrement ( const char *s ) ; + void makeIntVariable ( const char *s ) ; void makeFloatVariable ( const char *s ) ; void makeStringVariable( const char *s ) ; Index: pslContext.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslContext.cxx,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- pslContext.cxx 14 Sep 2002 05:32:16 -0000 1.11 +++ pslContext.cxx 14 Sep 2002 06:12:32 -0000 1.12 @@ -607,6 +607,32 @@ return PSL_PROGRAM_CONTINUE ; + case OPCODE_DECREMENT : + { + pslVariable *v = & ( variable [ code[++pc] ] ) ; + + if ( v -> getType () == PSL_INT ) + v -> set ( v -> getInt () - 1 ) ; + else + v -> set ( v -> getFloat () - 1 ) ; + + pc++ ; + } + return PSL_PROGRAM_CONTINUE ; + + case OPCODE_INCREMENT : + { + pslVariable *v = & ( variable [ code[++pc] ] ) ; + + if ( v -> getType () == PSL_INT ) + v -> set ( v -> getInt () + 1 ) ; + else + v -> set ( v -> getFloat () + 1 ) ; + + pc++ ; + } + return PSL_PROGRAM_CONTINUE ; + case OPCODE_SET_INT_VARIABLE : variable [ code[++pc] ] . setType ( PSL_INT ) ; pc++ ; Index: pslDump.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslDump.cxx,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- pslDump.cxx 14 Sep 2002 05:32:16 -0000 1.17 +++ pslDump.cxx 14 Sep 2002 06:12:32 -0000 1.18 @@ -57,6 +57,9 @@ { "SET_STRING_VARIABLE", OPCODE_SET_STRING_VARIABLE, 1 }, { "GET_PARAMETER" , OPCODE_GET_PARAMETER , 2 }, + { "INC" , OPCODE_INCREMENT , 1 }, + { "DEC" , OPCODE_DECREMENT , 1 }, + /* Flow Control */ { "CALLEXT", OPCODE_CALLEXT , 2 }, @@ -221,6 +224,8 @@ case OPCODE_POP_SHL_VARIABLE : case OPCODE_POP_SHR_VARIABLE : case OPCODE_POP_VARIABLE : + case OPCODE_INCREMENT : + case OPCODE_DECREMENT : fprintf ( fd, "\t[%d]", code [ addr+1 ] ) ; break ; Index: pslExpression.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslExpression.cxx,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- pslExpression.cxx 14 Sep 2002 01:30:05 -0000 1.11 +++ pslExpression.cxx 14 Sep 2002 06:12:32 -0000 1.12 @@ -114,6 +114,21 @@ return TRUE ; } + int preInc = FALSE ; + int preDec = FALSE ; + + if ( strcmp ( c, "++" ) == 0 ) + { + preInc = TRUE ; + getToken ( c ) ; + } + else + if ( strcmp ( c, "--" ) == 0 ) + { + preDec = TRUE ; + getToken ( c ) ; + } + if ( isalpha ( c [ 0 ] ) || c [ 0 ] == '_' ) { char n [ MAX_TOKEN ] ; @@ -121,9 +136,25 @@ ungetToken ( n ) ; if ( n[0] == '(' ) + { + if ( preInc || preDec ) + error ( "You can't apply '++' or '--' to a function call!" ) ; + pushFunctionCall ( c ) ; + } else + { + if ( preInc ) pushIncrement ( c ) ; + if ( preDec ) pushDecrement ( c ) ; + pushVariable ( c ) ; + + getToken ( n ) ; + + if ( strcmp ( n, "++" ) == 0 ) pushIncrement ( c ) ; else + if ( strcmp ( n, "--" ) == 0 ) pushDecrement ( c ) ; else + ungetToken ( n ) ; + } return TRUE ; } Index: pslOpcodes.h =================================================================== RCS file: /cvsroot/plib/plib/src/psl/pslOpcodes.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- pslOpcodes.h 14 Sep 2002 05:32:16 -0000 1.9 +++ pslOpcodes.h 14 Sep 2002 06:12:33 -0000 1.10 @@ -67,6 +67,8 @@ #define OPCODE_SET_STRING_VARIABLE 0x26 #define OPCODE_STACK_DUPLICATE 0x27 #define OPCODE_GET_PARAMETER 0x28 +#define OPCODE_INCREMENT 0x29 +#define OPCODE_DECREMENT 0x2A #define OPCODE_POP_ADD_VARIABLE 0x30 #define OPCODE_POP_SUB_VARIABLE 0x31 |