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 >
C/C++ Source or Header  |  1996-06-05  |  6KB  |  367 lines

  1. /*
  2.  *        実行処理
  3.  *
  4.  *        1994.5.22        T.Kobayashi
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <assert.h>
  11.  
  12. #include "exec.h"
  13. #include "err.h"
  14.  
  15. #include "inlib.h"
  16.  
  17. int            ExecDebug ;
  18. CodeStruct    *ExecPtr ;
  19. DataStruct    *DataGlobalVar, *DataLocalVar ;
  20. int            ExecLine ;
  21. char        *ExecFile ;
  22. int            MaxStacks = 1024 ;
  23.  
  24. static    int        ExecIf( int );
  25. static    int        ExecWhile( void );
  26. static    int        ExecDoWhile( void );
  27. static    int        ExecFor( void );
  28. static    int        ExecComplex( void );
  29. static    int        ExecBreak( void );
  30. static    int        ExecContinue( void );
  31.  
  32. extern    int    (*BreakCheck)(void);
  33.  
  34. /*        文を実行    */
  35. int        ExecSentense()
  36. {
  37.     int        ret = RETURN_NOMAL ;
  38.  
  39.     if ( ExecPtr == NULL )
  40.         return RETURN_END ;
  41.  
  42.     ExecLine = ExecPtr->sent.line ;
  43.     ExecFile = ExecPtr->sent.file ;
  44.  
  45.     if ((*BreakCheck)()) {
  46.         ExecError("強制終了しました");
  47.     }
  48.  
  49.     if ( ExecDebug )
  50.     {
  51.         printf( "EXEC[%06X][%s:%4d] : %d : %d\n",
  52.             ExecPtr, ExecFile, ExecLine, ExecPtr->type, ExecPtr->sent.stype );
  53.     }
  54.  
  55.     if (ExecPtr->type != CODE_SENTENSE) {
  56.         printf("ExecPtr = %08x\n", ExecPtr);
  57.         fflush(stdout);
  58.     }
  59.     assert( ExecPtr->type == CODE_SENTENSE );
  60.  
  61.     switch( ExecPtr->sent.stype )
  62.     {
  63.         case SENT_DEF_FUNC:
  64.             SkipSentense();
  65.             break ;
  66.         case SENT_VAR:
  67.             ExecVar();
  68.             break ;
  69.         case SENT_ASSIGN:
  70.             ExecAssign( ExecPtr->sent.stype );
  71.             break ;
  72.         case SENT_ASN_PLUS:
  73.         case SENT_ASN_MINUS:
  74.         case SENT_ASN_MULT:
  75.         case SENT_ASN_DIVIDE:
  76.         case SENT_ASN_AND:
  77.         case SENT_ASN_OR:
  78.             ExecAssignOpe( ExecPtr->sent.stype );
  79.             break ;
  80.         case SENT_ASN_INC:
  81.         case SENT_ASN_DEC:
  82.             ExecAssignInc( ExecPtr->sent.stype );
  83.             break ;
  84.         case SENT_IF:
  85.             ret = ExecIf( FALSE );
  86.             break ;
  87.         case SENT_IF_ELSE:
  88.             ret = ExecIf( TRUE );
  89.             break ;
  90.         case SENT_WHILE:
  91.             ret = ExecWhile();
  92.             break ;
  93.         case SENT_DO:
  94.             ret = ExecDoWhile();
  95.             break ;
  96.         case SENT_FOR:
  97.             ret = ExecFor();
  98.             break ;
  99.         case SENT_EXPRESS:
  100.             GotoNextCode();
  101.             ExecExpression();
  102.             StackPop();
  103.             break ;
  104.         case SENT_BREAK:
  105.             ret = ExecBreak();
  106.             break ;
  107.         case SENT_CONTINUE:
  108.             ret = ExecContinue();
  109.             break ;
  110.         case SENT_RETURN:
  111.             ret = ExecReturn();
  112.             break ;
  113.         case SENT_COMPLEX:
  114.             ret = ExecComplex();
  115.             break ;
  116.         case SENT_NULL:
  117.             GotoNextCode();
  118.             break;
  119.         default:
  120.             assert( FALSE );
  121.     }
  122.     return ret ;
  123. }
  124.  
  125. /*
  126.  *        文をスキップ
  127.  */
  128. void    SkipSentense()
  129. {
  130.     ExecPtr = CodeNextSentense( ExecPtr );
  131. }
  132.  
  133. /*
  134.  *        if 文の実行
  135.  */
  136. static    int        ExecIf( sw )
  137. int            sw ;
  138. {
  139.     int            ret = RETURN_NOMAL ;
  140.     int            flag ;
  141.     DataStruct    *buf ;
  142.  
  143.     GotoNextCode();
  144.  
  145.     /*    条件式    */
  146.     ExecExpression();
  147.     buf = StackTop();
  148.     if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
  149.         ExecError( "条件式が不正です" );
  150.  
  151.     flag = buf->id.i ;
  152.     StackPop();
  153.  
  154.     /*    条件分岐    */
  155.     if ( flag )
  156.     {
  157.         ret = ExecSentense();
  158.         if ( sw )
  159.             SkipSentense();
  160.     }
  161.     else
  162.     {
  163.         SkipSentense();
  164.         if ( sw )
  165.             ret = ExecSentense();
  166.     }
  167.     return ret ;
  168. }
  169.  
  170. /*
  171.  *        while 文の実行
  172.  */
  173. static    int        ExecWhile()
  174. {
  175.     int        flag ;
  176.     int        ret = RETURN_NOMAL ;
  177.     CodeStruct    *condptr ;    /*    条件式の位置    */
  178.     DataStruct    *buf ;
  179.  
  180.     GotoNextCode();
  181.     condptr = ExecPtr ;
  182.  
  183.     for(;;)
  184.     {
  185.         /*    条件式    */
  186.         ExecExpression();
  187.         buf = StackTop();
  188.         if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
  189.             ExecError( "条件式が不正です" );
  190.         flag = buf->id.i ;
  191.         StackPop();
  192.  
  193.         /*    条件分岐    */
  194.         if ( flag )
  195.         {
  196.             ret = ExecSentense();
  197.             if ( ret == RETURN_CONTINUE )
  198.                 ret = RETURN_NOMAL ;
  199.             if ( ret == RETURN_BREAK )
  200.             {
  201.                 ret = RETURN_NOMAL ;
  202.                 break ;
  203.             }
  204.             if ( ret == RETURN_RETURN )
  205.                 break ;
  206.             ExecPtr = condptr ;
  207.         }
  208.         else
  209.         {
  210.             SkipSentense();
  211.             break ;
  212.         }
  213.     }
  214.     return ret ;
  215. }
  216.  
  217. /*
  218.  *        do-while 文の実行
  219.  */
  220. static    int        ExecDoWhile()
  221. {
  222.     int        ret = RETURN_NOMAL ;
  223.     CodeStruct    *endadr ;    /*    終了アドレス        */
  224.     CodeStruct    *sentadr ;    /*    実行文のアドレス    */
  225.     DataStruct    *buf ;
  226.  
  227.     GotoNextCode();
  228.     endadr = (CodeStruct*)( ExecPtr->c.data.id.i );
  229.     GotoNextCode();
  230.     sentadr = ExecPtr ;
  231.  
  232.     for(;;)
  233.     {
  234.         /*    文実行    */
  235.         ret = ExecSentense();
  236.         if ( ret == RETURN_CONTINUE )
  237.             ret = RETURN_NOMAL ;
  238.         if ( ret == RETURN_BREAK )
  239.         {
  240.             ret = RETURN_NOMAL ;
  241.             break ;
  242.         }
  243.         if ( ret == RETURN_RETURN )
  244.             break ;
  245.  
  246.         /*    条件式    */
  247.         ExecExpression();
  248.         buf = StackTop();
  249.         if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
  250.             ExecError( "条件式が不正です" );
  251.         StackPop();
  252.         if ( buf->id.i )
  253.             ExecPtr = sentadr ;
  254.         else
  255.             break ;
  256.     }
  257.     ExecPtr = endadr ;
  258.     return ret ;
  259. }
  260.  
  261. /*
  262.  *        for 文の実行
  263.  */
  264. static    int        ExecFor()
  265. {
  266.     int        flag ;
  267.     int        ret = RETURN_NOMAL ;
  268.     CodeStruct    *repptr ;    /*    繰り返し文の位置    */
  269.     CodeStruct    *condptr ;    /*    条件式の位置    */
  270.     DataStruct    *buf ;
  271.  
  272.     GotoNextCode();
  273.  
  274.     /*    初期化文    */
  275.     ExecSentense();
  276.     condptr = ExecPtr ;
  277.  
  278.     for(;;)
  279.     {
  280.         /*    条件式    */
  281.         ExecPtr = condptr ;
  282.         ExecExpression();
  283.         buf = StackTop();
  284.         if ( ( buf->type & (TYPE_BOOLEAN|TYPE_INT) ) == 0 )
  285.             ExecError( "条件式が不正です" );
  286.         flag = buf->id.i ;
  287.         StackPop();
  288.  
  289.         repptr = ExecPtr ;
  290.         SkipSentense();
  291.  
  292.         /*    条件分岐    */
  293.         if ( flag )
  294.         {
  295.             ret = ExecSentense();
  296.             if ( ret == RETURN_CONTINUE )
  297.                 ret = RETURN_NOMAL ;
  298.             if ( ret == RETURN_BREAK )
  299.             {
  300.                 ret = RETURN_NOMAL ;
  301.                 break ;
  302.             }
  303.             if ( ret == RETURN_RETURN )
  304.                 break ;
  305.         }
  306.         else
  307.         {
  308.             SkipSentense();
  309.             break ;
  310.         }
  311.  
  312.         /*    繰り返し文    */
  313.         ExecPtr = repptr ;
  314.         ExecSentense();
  315.     }
  316.     return ret ;
  317. }
  318.  
  319. /*
  320.  *        複文の実行
  321.  */
  322. static    int        ExecComplex()
  323. {
  324.     int        ret = RETURN_NOMAL ;
  325.     CodeStruct    *endadr ;
  326.     CodeStruct    *code ;
  327.  
  328.     GotoNextCode();
  329.     code = ExecPtr;
  330.     assert( code->type == CODE_CONST );
  331.     endadr = (CodeStruct*)( code->c.data.id.i );
  332.  
  333.     GotoNextCode();
  334.     while( ExecPtr < endadr )
  335.     {
  336.         ret = ExecSentense();
  337.         if ( ret != RETURN_NOMAL )
  338.             break ;
  339.     }
  340.  
  341.     if ( endadr >= CodeNextPtr() )
  342.         ExecPtr = NULL ;
  343.     else
  344.         ExecPtr = endadr ;
  345.     return ret ;
  346. }
  347.  
  348. /*
  349.  *        break 文の実行
  350.  */
  351. static    int        ExecBreak()
  352. {
  353.     GotoNextCode();
  354.     return RETURN_BREAK ;
  355. }
  356.  
  357.  
  358. /*
  359.  *        continue 文の実行
  360.  */
  361. static    int        ExecContinue()
  362. {
  363.     GotoNextCode();
  364.     return RETURN_CONTINUE ;
  365. }
  366.  
  367.