home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
ML
/
EXEC1.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-05
|
6KB
|
367 lines
/*
* 実行処理
*
* 1994.5.22 T.Kobayashi
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "exec.h"
#include "err.h"
#include "inlib.h"
int ExecDebug ;
CodeStruct *ExecPtr ;
DataStruct *DataGlobalVar, *DataLocalVar ;
int ExecLine ;
char *ExecFile ;
int MaxStacks = 1024 ;
static int ExecIf( int );
static int ExecWhile( void );
static int ExecDoWhile( void );
static int ExecFor( void );
static int ExecComplex( void );
static int ExecBreak( void );
static int ExecContinue( void );
extern int (*BreakCheck)(void);
/* 文を実行 */
int ExecSentense()
{
int ret = RETURN_NOMAL ;
if ( ExecPtr == NULL )
return RETURN_END ;
ExecLine = ExecPtr->sent.line ;
ExecFile = ExecPtr->sent.file ;
if ((*BreakCheck)()) {
ExecError("強制終了しました");
}
if ( ExecDebug )
{
printf( "EXEC[%06X][%s:%4d] : %d : %d\n",
ExecPtr, ExecFile, ExecLine, ExecPtr->type, ExecPtr->sent.stype );
}
if (ExecPtr->type != CODE_SENTENSE) {
printf("ExecPtr = %08x\n", ExecPtr);
fflush(stdout);
}
assert( ExecPtr->type == CODE_SENTENSE );
switch( ExecPtr->sent.stype )
{
case SENT_DEF_FUNC:
SkipSentense();
break ;
case SENT_VAR:
ExecVar();
break ;
case SENT_ASSIGN:
ExecAssign( ExecPtr->sent.stype );
break ;
case SENT_ASN_PLUS:
case SENT_ASN_MINUS:
case SENT_ASN_MULT:
case SENT_ASN_DIVIDE:
case SENT_ASN_AND:
case SENT_ASN_OR:
ExecAssignOpe( ExecPtr->sent.stype );
break ;
case SENT_ASN_INC:
case SENT_ASN_DEC:
ExecAssignInc( ExecPtr->sent.stype );
break ;
case SENT_IF:
ret = ExecIf( FALSE );
break ;
case SENT_IF_ELSE:
ret = ExecIf( TRUE );
break ;
case SENT_WHILE:
ret = ExecWhile();
break ;
case SENT_DO:
ret = ExecDoWhile();
break ;
case SENT_FOR:
ret = ExecFor();
break ;
case SENT_EXPRESS:
GotoNextCode();
ExecExpression();
StackPop();
break ;
case SENT_BREAK:
ret = ExecBreak();
break ;
case SENT_CONTINUE:
ret = ExecContinue();
break ;
case SENT_RETURN:
ret = ExecReturn();
break ;
case SENT_COMPLEX:
ret = ExecComplex();
break ;
case SENT_NULL:
GotoNextCode();
break;
default:
assert( FALSE );
}
return ret ;
}
/*
* 文をスキップ
*/
void SkipSentense()
{
ExecPtr = CodeNextSentense( ExecPtr );
}
/*
* if 文の実行
*/
static int ExecIf( sw )
int sw ;
{
int ret = RETURN_NOMAL ;
int flag ;
DataStruct *buf ;
GotoNextCode();
/* 条件式 */
ExecExpression();
buf = StackTop();
if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
ExecError( "条件式が不正です" );
flag = buf->id.i ;
StackPop();
/* 条件分岐 */
if ( flag )
{
ret = ExecSentense();
if ( sw )
SkipSentense();
}
else
{
SkipSentense();
if ( sw )
ret = ExecSentense();
}
return ret ;
}
/*
* while 文の実行
*/
static int ExecWhile()
{
int flag ;
int ret = RETURN_NOMAL ;
CodeStruct *condptr ; /* 条件式の位置 */
DataStruct *buf ;
GotoNextCode();
condptr = ExecPtr ;
for(;;)
{
/* 条件式 */
ExecExpression();
buf = StackTop();
if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
ExecError( "条件式が不正です" );
flag = buf->id.i ;
StackPop();
/* 条件分岐 */
if ( flag )
{
ret = ExecSentense();
if ( ret == RETURN_CONTINUE )
ret = RETURN_NOMAL ;
if ( ret == RETURN_BREAK )
{
ret = RETURN_NOMAL ;
break ;
}
if ( ret == RETURN_RETURN )
break ;
ExecPtr = condptr ;
}
else
{
SkipSentense();
break ;
}
}
return ret ;
}
/*
* do-while 文の実行
*/
static int ExecDoWhile()
{
int ret = RETURN_NOMAL ;
CodeStruct *endadr ; /* 終了アドレス */
CodeStruct *sentadr ; /* 実行文のアドレス */
DataStruct *buf ;
GotoNextCode();
endadr = (CodeStruct*)( ExecPtr->c.data.id.i );
GotoNextCode();
sentadr = ExecPtr ;
for(;;)
{
/* 文実行 */
ret = ExecSentense();
if ( ret == RETURN_CONTINUE )
ret = RETURN_NOMAL ;
if ( ret == RETURN_BREAK )
{
ret = RETURN_NOMAL ;
break ;
}
if ( ret == RETURN_RETURN )
break ;
/* 条件式 */
ExecExpression();
buf = StackTop();
if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
ExecError( "条件式が不正です" );
StackPop();
if ( buf->id.i )
ExecPtr = sentadr ;
else
break ;
}
ExecPtr = endadr ;
return ret ;
}
/*
* for 文の実行
*/
static int ExecFor()
{
int flag ;
int ret = RETURN_NOMAL ;
CodeStruct *repptr ; /* 繰り返し文の位置 */
CodeStruct *condptr ; /* 条件式の位置 */
DataStruct *buf ;
GotoNextCode();
/* 初期化文 */
ExecSentense();
condptr = ExecPtr ;
for(;;)
{
/* 条件式 */
ExecPtr = condptr ;
ExecExpression();
buf = StackTop();
if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
ExecError( "条件式が不正です" );
flag = buf->id.i ;
StackPop();
repptr = ExecPtr ;
SkipSentense();
/* 条件分岐 */
if ( flag )
{
ret = ExecSentense();
if ( ret == RETURN_CONTINUE )
ret = RETURN_NOMAL ;
if ( ret == RETURN_BREAK )
{
ret = RETURN_NOMAL ;
break ;
}
if ( ret == RETURN_RETURN )
break ;
}
else
{
SkipSentense();
break ;
}
/* 繰り返し文 */
ExecPtr = repptr ;
ExecSentense();
}
return ret ;
}
/*
* 複文の実行
*/
static int ExecComplex()
{
int ret = RETURN_NOMAL ;
CodeStruct *endadr ;
CodeStruct *code ;
GotoNextCode();
code = ExecPtr;
assert( code->type == CODE_CONST );
endadr = (CodeStruct*)( code->c.data.id.i );
GotoNextCode();
while( ExecPtr < endadr )
{
ret = ExecSentense();
if ( ret != RETURN_NOMAL )
break ;
}
if ( endadr >= CodeNextPtr() )
ExecPtr = NULL ;
else
ExecPtr = endadr ;
return ret ;
}
/*
* break 文の実行
*/
static int ExecBreak()
{
GotoNextCode();
return RETURN_BREAK ;
}
/*
* continue 文の実行
*/
static int ExecContinue()
{
GotoNextCode();
return RETURN_CONTINUE ;
}