亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? unit1.cpp

?? 在本編譯程序中,源語(yǔ)言為PL/0語(yǔ)言,目標(biāo)語(yǔ)言為假想棧式計(jì)算機(jī)的匯編語(yǔ)言.PL/0語(yǔ)言是Pascal語(yǔ)言的一個(gè)子集
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):


/*** PL0 COMPILER WITH CODE GENERATION ***/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
const  AL    =  10;  /* LENGTH OF IDENTIFIERS */
const  NORW  =  18;  /* # OF RESERVED WORDS */
const  TXMAX = 100;  /* LENGTH OF IDENTIFIER TABLE */
const  NMAX  =  14;  /* MAX NUMBER OF DEGITS IN NUMBERS */
const  AMAX  =2047;  /* MAXIMUM ADDRESS */
const  LEVMAX=   3;  /* MAX DEPTH OF BLOCK NESTING */
const  CXMAX = 200;  /* SIZE OF CODE ARRAY */

typedef enum  { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,
	            SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,
                    PEQ,MEQ , INC,DEC,
	            LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,
	            BECOMES, BEGINSYM, ELSESYM, ENDSYM, IFSYM, THENSYM,
	            WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,
	            CONSTSYM, VARSYM, PROCSYM, PROGSYM,
                    FORSYM,TOSYM,DOWNTOSYM
        } SYMBOL;
char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES",
	    "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ",
            "PEQ", "MEQ", "INC","DEC", "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD",
	    "BECOMES", "BEGINSYM", "ELSESYM", "ENDSYM", "IFSYM", "THENSYM",
	    "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM",
	    "CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM",
            "FORSYM", "TOSYM", "DOWNTOSYM"};
typedef  int *SYMSET; // SET OF SYMBOL;
typedef  char ALFA[11];
typedef  enum { CONSTANT, VARIABLE, PROCEDUR } OBJECTS ;
typedef  enum { LIT, OPR, LOD, STO, CAL, INI, JMP, JPC } FCT;
typedef struct {
	 FCT F;     /*FUNCTION CODE*/
	 int L; 	/*0..LEVMAX  LEVEL*/
	 int A;     /*0..AMAX    DISPLACEMENT ADDR*/
} INSTRUCTION;
	  /* LIT O A -- LOAD CONSTANT A             */
	  /* OPR 0 A -- EXECUTE OPR A               */
	  /* LOD L A -- LOAD VARIABLE L,A           */
	  /* STO L A -- STORE VARIABLE L,A          */
	  /* CAL L A -- CALL PROCEDURE A AT LEVEL L */
	  /* INI 0 A -- INCREMET T-REGISTER BY A    */
	  /* JMP 0 A -- JUMP TO A                   */
	  /* JPC 0 A -- JUMP CONDITIONAL TO A       */
char   CH;  /*LAST CHAR READ*/
SYMBOL SYM; /*LAST SYMBOL READ*/
ALFA   ID;  /*LAST IDENTIFIER READ*/
int    NUM; /*LAST NUMBER READ*/
int    CC;  /*CHARACTER COUNT*/
int    LL;  /*LINE LENGTH*/
int    CX;  /*CODE ALLOCATION INDEX*/
char   LINE[81];
INSTRUCTION  CODE[CXMAX];
ALFA    KWORD[NORW+1];
SYMBOL  WSYM[NORW+1];
SYMBOL  SSYM['^'+1];
ALFA    MNEMONIC[9];
SYMSET  DECLBEGSYS, STATBEGSYS, FACBEGSYS;

struct {
  ALFA NAME;
  OBJECTS KIND;
  union {
    int VAL;   /*CONSTANT*/
    struct { int LEVEL,ADR,SIZE; } vp;  /*VARIABLE,PROCEDUR:*/
  };
} TABLE[TXMAX];

FILE *FIN,*FOUT;
int ERR;

void EXPRESSION(SYMSET FSYS, int LEV, int &TX);
void TERM(SYMSET FSYS, int LEV, int &TX);
//---------------------------------------------------------------------------
int SymIn(SYMBOL SYM, SYMSET S1) {
  return S1[SYM];
}
//---------------------------------------------------------------------------
SYMSET SymSetUnion(SYMSET S1, SYMSET S2) {
  SYMSET S=(SYMSET)malloc(sizeof(int)*41);
  for (int i=0; i<41; i++)
	if (S1[i] || S2[i]) S[i]=1;
	else S[i]=0;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetAdd(SYMBOL SY, SYMSET S) {
  SYMSET S1;
  S1=(SYMSET)malloc(sizeof(int)*41);
  for (int i=0; i<41; i++) S1[i]=S[i];
  S1[SY]=1;
  return S1;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a, SYMBOL b) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;  S[b]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a, SYMBOL b, SYMBOL c) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;  S[b]=1; S[c]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a, SYMBOL b, SYMBOL c, SYMBOL d) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;  S[b]=1; S[c]=1; S[d]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a, SYMBOL b, SYMBOL c, SYMBOL d,SYMBOL e) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;  S[b]=1; S[c]=1; S[d]=1; S[e]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNew(SYMBOL a, SYMBOL b, SYMBOL c, SYMBOL d,SYMBOL e, SYMBOL f) {
  SYMSET S; int i,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  S[a]=1;  S[b]=1; S[c]=1; S[d]=1; S[e]=1; S[f]=1;
  return S;
}
//---------------------------------------------------------------------------
SYMSET SymSetNULL() {
  SYMSET S; int i,n,k;
  S=(SYMSET)malloc(sizeof(int)*41);
  for (i=0; i<41; i++) S[i]=0;
  return S;
}
//---------------------------------------------------------------------------
void Error(int n) {
  String s = "***"+AnsiString::StringOfChar(' ', CC-1)+"^";
  Form1->printls(s.c_str(),n);   fprintf(FOUT,"%s%d\n", s.c_str(), n);
  ERR++;
} /*Error*/
//---------------------------------------------------------------------------
void GetCh() {
  if (CC==LL) {
    if (feof(FIN)) {
	  Form1->printfs("PROGRAM INCOMPLETE");
	  fprintf(FOUT,"PROGRAM INCOMPLETE\n");
	  fclose(FOUT);
	  exit(0);
	}
	LL=0; CC=0;
	CH=' ';
	while (!feof(FIN) && CH!=10)
      { CH=fgetc(FIN);  LINE[LL++]=CH; }
	LINE[LL-1]=' ';  LINE[LL]=0;
    String s=IntToStr(CX);
    while(s.Length()<3) s=" "+s;
    s=s+" "+LINE;
	Form1->printfs(s.c_str());
    fprintf(FOUT,"%s\n",s);
  }
  CH=LINE[CC++];
} /*GetCh()*/
//---------------------------------------------------------------------------

void GetSym() {
  int i,J,K;   ALFA  A;
  while (CH<=' ') GetCh();
  if (CH>='A' && CH<='Z') { /*ID OR RESERVED WORD*/
    K=0;
	do {
	  if (K<AL) A[K++]=CH;
	  GetCh();
	}while((CH>='A' && CH<='Z')||(CH>='0' && CH<='9'));
	A[K]='\0';
	strcpy(ID,A); i=1; J=NORW;
	do {
	  K=(i+J) / 2;
	  if (strcmp(ID,KWORD[K])<=0) J=K-1;
	  if (strcmp(ID,KWORD[K])>=0) i=K+1;
	}while(i<=J);
	if (i-1 > J) SYM=WSYM[K];
	else SYM=IDENT;
  }
  else
    if (CH>='0' && CH<='9') { /*NUMBER*/
      K=0; NUM=0; SYM=NUMBER;
	  do {
	    NUM=10*NUM+(CH-'0');
		K++; GetCh();
      }while(CH>='0' && CH<='9');
	  if (K>NMAX) Error(30);
    }
    else
      if (CH==':') {
	    GetCh();
		if (CH=='=') { SYM=BECOMES; GetCh(); }
		else SYM=NUL;
      }
	  else /* THE FOLLOWING TWO CHECK WERE ADDED
	         BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR <= OR >= */
	    if (CH=='<') {
		  GetCh();
		  if (CH=='=') { SYM=LEQ; GetCh(); }
		  else if (CH=='>') { SYM=NEQ; GetCh(); }
                       else SYM=LSS;
		}
		else
		  if (CH=='>') {
		    GetCh();
			if (CH=='=') { SYM=GEQ; GetCh(); }
			else SYM=GTR;
                  }
                  else
		  if (CH=='+') {
		    GetCh();
			if (CH=='=') { SYM=PEQ; GetCh(); }
			else if (CH=='+') {SYM=INC;GetCh();}
                        else
                             SYM=PLUS;
                  }
                  else
		  if (CH=='-') {
		    GetCh();
			if (CH=='=') { SYM=MEQ; GetCh(); }
			else if (CH=='-') {SYM=DEC;GetCh();}
                        else
                            SYM=MINUS;
                  }

		  else { SYM=SSYM[CH]; GetCh(); }
} /*GetSym()*/
//---------------------------------------------------------------------------
void GEN(FCT X, int Y, int Z) {
  if (CX>CXMAX) {
    Form1->printfs("PROGRAM TOO LONG");
	fprintf(FOUT,"PROGRAM TOO LONG\n");
	fclose(FOUT);
    exit(0);
  }
  CODE[CX].F=X; CODE[CX].L=Y; CODE[CX].A=Z;
  CX++;
} /*GEN*/
//---------------------------------------------------------------------------
void TEST(SYMSET S1, SYMSET S2, int N) {
  if (!SymIn(SYM,S1)) {
    Error(N);
	while (!SymIn(SYM,SymSetUnion(S1,S2))) GetSym();
  }
} /*TEST*/
//---------------------------------------------------------------------------
void ENTER(OBJECTS K, int LEV, int &TX, int &DX) { /*ENTER OBJECT INTO TABLE*/
  TX++;
  strcpy(TABLE[TX].NAME,ID); TABLE[TX].KIND=K;
  switch (K) {
	case CONSTANT:
	       if (NUM>AMAX) { Error(31); NUM=0; }
	       TABLE[TX].VAL=NUM;
	       break;
    case VARIABLE:
	       TABLE[TX].vp.LEVEL=LEV; TABLE[TX].vp.ADR=DX; DX++;
	       break;
	case PROCEDUR:
	       TABLE[TX].vp.LEVEL=LEV;
	       break;
  }
} /*ENTER*/
//---------------------------------------------------------------------------
int POSITION(ALFA ID, int TX) { /*FIND IDENTIFIER IN TABLE*/
  int i=TX;
  strcpy(TABLE[0].NAME,ID);
  while (strcmp(TABLE[i].NAME,ID)!=0) i--;
  return i;
} /*POSITION*/
//---------------------------------------------------------------------------
void ConstDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT) {
    GetSym();
    if (SYM==EQL||SYM==BECOMES) {
	  if (SYM==BECOMES) Error(1);
	  GetSym();
	  if (SYM==NUMBER) { ENTER(CONSTANT,LEV,TX,DX); GetSym(); }
	  else Error(2);
    }
    else Error(3);
  }
  else Error(4);
} /*ConstDeclaration()*/
//---------------------------------------------------------------------------
void VarDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT) { ENTER(VARIABLE,LEV,TX,DX); GetSym(); }
  else Error(4);
} /*VarDeclaration()*/
//---------------------------------------------------------------------------
void ListCode(int CX0) {  /*LIST CODE GENERATED FOR THIS Block*/
  if (Form1->ListSwitch->ItemIndex==0)
    for (int i=CX0; i<CX; i++) {
      String s=IntToStr(i);
      while(s.Length()<3)s=" "+s;
      s=s+" "+MNEMONIC[CODE[i].F]+" "+IntToStr(CODE[i].L)+" "+IntToStr(CODE[i].A);
	  Form1->printfs(s.c_str());
	  fprintf(FOUT,"%3d%5s%4d%4d\n",i,MNEMONIC[CODE[i].F],CODE[i].L,CODE[i].A);
    }
} /*ListCode()*/;
//---------------------------------------------------------------------------
void FACTOR(SYMSET FSYS, int LEV, int &TX) {
  int i;
  TEST(FACBEGSYS,FSYS,24);
  while (SymIn(SYM,FACBEGSYS)) {
	if (SYM==IDENT) {
	  i=POSITION(ID,TX);
	  if (i==0) Error(11);
	  else
		switch (TABLE[i].KIND) {
		  case CONSTANT: GEN(LIT,0,TABLE[i].VAL); break;
		  case VARIABLE: GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); break;
		  case PROCEDUR: Error(21); break;
		}
	  GetSym();
	}
	else
	  if (SYM==NUMBER) {
		if (NUM>AMAX) { Error(31); NUM=0; }
		GEN(LIT,0,NUM); GetSym();
	  }
	  else
		if (SYM==LPAREN) {
		  GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX);
		  if (SYM==RPAREN) GetSym();
		  else Error(22);
		}
	  TEST(FSYS,FACBEGSYS,23);
  }
}/*FACTOR*/
//---------------------------------------------------------------------------
void TERM(SYMSET FSYS, int LEV, int &TX) {  /*TERM*/
  SYMBOL MULOP;
  FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)), LEV,TX);
  while (SYM==TIMES || SYM==SLASH) {
	MULOP=SYM;  GetSym();
	FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)),LEV,TX);
	if (MULOP==TIMES) GEN(OPR,0,4);
	else GEN(OPR,0,5);
  }
} /*TERM*/;
//---------------------------------------------------------------------------
void EXPRESSION(SYMSET FSYS, int LEV, int &TX) {
  SYMBOL ADDOP;
  if (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM; GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
    if (ADDOP==MINUS) GEN(OPR,0,1);
  }
/*  else if (SYM==NUMBER) {//ADDOP=SYM; GetSym();
                       //TERM(FSYS,LEV,TX);
                       GEN(OPR,0,2);}  */
     else TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
  while (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM; GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
    if (ADDOP==PLUS) GEN(OPR,0,2);
    else GEN(OPR,0,3);
  }
} /*EXPRESSION*/
//---------------------------------------------------------------------------
void CONDITION(SYMSET FSYS,int LEV,int &TX) {
  SYMBOL RELOP;
  if (SYM==ODDSYM) { GetSym(); EXPRESSION(FSYS,LEV,TX); GEN(OPR,0,6); }
  else {
	EXPRESSION(SymSetUnion(SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ),FSYS),LEV,TX);
	if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ))) Error(20);
	else {
	  RELOP=SYM; GetSym(); EXPRESSION(FSYS,LEV,TX);
	  switch (RELOP) {
	    case EQL: GEN(OPR,0,8);  break;
	    case NEQ: GEN(OPR,0,9);  break;
	    case LSS: GEN(OPR,0,10); break;
	    case GEQ: GEN(OPR,0,11); break;
	    case GTR: GEN(OPR,0,12); break;
	    case LEQ: GEN(OPR,0,13); break;
	  }
	}
  }
} /*CONDITION*/

void STATEMENT(SYMSET FSYS,int LEV,int &TX) {   /*STATEMENT*/
  int i,j,CX1,CX2;
  switch (SYM) {
	case IDENT:
		i=POSITION(ID,TX);
		if (i==0) Error(11);
		else
		  if (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT TO NON-VARIABLE*/
			Error(12); i=0;
		  }
        GetSym();
		if (SYM==BECOMES){ GetSym(); EXPRESSION(FSYS,LEV,TX); }
                else if (SYM==PEQ) {GetSym();
                                   GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                   EXPRESSION(FSYS,LEV,TX);
                                   GEN(OPR,0,2); }
                     else if (SYM==MEQ){ GetSym();
                                   GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                   EXPRESSION(FSYS,LEV,TX);
                                   GEN(OPR,0,3); }
                     else if(SYM==INC){ GetSym();
                                   GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                   GEN(LIT,0,1);
                                   GEN(OPR,0,2);
                                    }
                       else if(SYM==DEC){ GetSym();
                                   GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                   GEN(LIT,0,1);
                                   GEN(OPR,0,3);
                                    }
                          else Error(13);

		if (i!=0) GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
		break;
	case READSYM:
		GetSym();
		if (SYM!=LPAREN) Error(34);
		else
		  do {
			GetSym();
			if (SYM==IDENT) i=POSITION(ID,TX);
			else i=0;
			if (i==0) Error(35);
			else {
			  GEN(OPR,0,16);
			  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
			}
			GetSym();
		  }while(SYM==COMMA);
		if (SYM!=RPAREN) {
		  Error(33);
		  while (!SymIn(SYM,FSYS)) GetSym();
		}
		else GetSym();
		break; /* READSYM */
	case WRITESYM:
	       	GetSym();
		if (SYM==LPAREN) {
		  do {
			GetSym();
			EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
			GEN(OPR,0,14);
		  }while(SYM==COMMA);
		  if (SYM!=RPAREN) Error(33);
		  else GetSym();
		}
		GEN(OPR,0,15);
		break; /*WRITESYM*/
	case CALLSYM:
		GetSym();
		if (SYM!=IDENT) Error(14);
		else {
		  i=POSITION(ID,TX);
		  if (i==0) Error(11);
		  else
			if (TABLE[i].KIND==PROCEDUR)
			  GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
			else Error(15);
		  GetSym();
		}
		break;
        case IFSYM:
		GetSym();
		CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM,ELSESYM),FSYS),LEV,TX);
		if (SYM==THENSYM) GetSym();
		else Error(16);
		CX1=CX;
                GEN(JPC,0,0);
                 // break;
	       	STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);
                GetSym();
               if(SYM==ELSESYM){CX2=CX; GEN(JMP,0,0);
                 GetSym();CODE[CX1].A=CX;
                 STATEMENT(FSYS,LEV,TX);
                  CODE[CX2].A=CX;}
                  else CODE[CX1].A=CX;
                  break; 



        case FORSYM:
                GetSym();
                j=POSITION(ID,TX);
                STATEMENT(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM),FSYS),LEV,TX);
                if(SYM==TOSYM){//步長(zhǎng)為 1 的情況;
                   CX1=CX;
                   GetSym();
                   EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);
                   GEN(LOD,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(OPR,0,11);
                   CX2=CX;
                   GEN(JPC,0,0);
                   if(SYM==DOSYM){
                      GetSym();
                      STATEMENT(FSYS,LEV,TX);
                   }
                   GEN(LIT,0,1);
                   GEN(LOD,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(OPR,0,2);
                   GEN(STO,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(JMP,0,CX1);
                   CODE[CX2].A=CX;
                }
                else if(SYM==DOWNTOSYM){//步長(zhǎng)為 -1 的情況;
                   CX1=CX;
                   GetSym();
                   EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);
                   GEN(LOD,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(OPR,0,13);
                   CX2=CX;
                   GEN(JPC,0,0);
                   if(SYM==DOSYM){
                      GetSym();
                      STATEMENT(FSYS,LEV,TX);
                   }
                   GEN(LOD,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(LIT,0,1);
                   GEN(OPR,0,3);
                   GEN(STO,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                   GEN(JMP,0,CX1);
                   CODE[CX2].A=CX;
                }

                break;

	case BEGINSYM:
		GetSym();
		STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);
		while (SymIn(SYM, SymSetAdd(SEMICOLON,STATBEGSYS))) {
		  if (SYM==SEMICOLON) GetSym();
		  else Error(10);
		  STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);
		}
		if (SYM==ENDSYM) GetSym();
		else Error(17);
		break;
	case WHILESYM:
		CX1=CX; GetSym(); CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX);
		CX2=CX; GEN(JPC,0,0);
		if (SYM==DOSYM) GetSym();
		else Error(18);
		STATEMENT(FSYS,LEV,TX);
		GEN(JMP,0,CX1);
		CODE[CX2].A=CX;
		break;
  }
  TEST(FSYS,SymSetNULL(),19);
} /*STATEMENT*/
void Block(int LEV, int TX, SYMSET FSYS) {
  int DX=3;    /*DATA ALLOCATION INDEX*/
  int TX0=TX;  /*INITIAL TABLE INDEX*/
  int CX0=CX;  /*INITIAL CODE INDEX*/
  TABLE[TX].vp.ADR=CX; GEN(JMP,0,0);
  if (LEV>LEVMAX) Error(32);
  do {
    if (SYM==CONSTSYM) {
      GetSym();
      do {
        ConstDeclaration(LEV,TX,DX);
        while (SYM==COMMA) {
          GetSym();  ConstDeclaration(LEV,TX,DX);
        }
        if (SYM==SEMICOLON) GetSym();
        else Error(5);
      }while(SYM==IDENT);
    }
    if (SYM==VARSYM) {
      GetSym();
      do {
        VarDeclaration(LEV,TX,DX);
        while (SYM==COMMA) { GetSym(); VarDeclaration(LEV,TX,DX); }
	    if (SYM==SEMICOLON) GetSym();
	    else Error(5);
      }while(SYM==IDENT);
    }
    while ( SYM==PROCSYM) {
      GetSym();
	  if (SYM==IDENT) { ENTER(PROCEDUR,LEV,TX,DX); GetSym(); }
	  else Error(4);
	  if (SYM==SEMICOLON) GetSym();
	  else Error(5);
	  Block(LEV+1,TX,SymSetAdd(SEMICOLON,FSYS));
	  if (SYM==SEMICOLON) {
	    GetSym();
	    TEST(SymSetUnion(SymSetNew(IDENT,PROCSYM),STATBEGSYS),FSYS,6);
	  }
	  else Error(5);
    }
    TEST(SymSetAdd(IDENT,STATBEGSYS), DECLBEGSYS,7);
  }while(SymIn(SYM,DECLBEGSYS));
  CODE[TABLE[TX0].vp.ADR].A=CX;
  TABLE[TX0].vp.ADR=CX;   /*START ADDR OF CODE*/
  TABLE[TX0].vp.SIZE=DX;  /*SIZE OF DATA SEGMENT*/
  GEN(INI,0,DX);
  STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);
  GEN(OPR,0,0);  /*RETURN*/
  TEST(FSYS,SymSetNULL(),8);
  ListCode(CX0);
} /*Block*/
//---------------------------------------------------------------------------
int BASE(int L,int B,int S[]) {
  int B1=B; /*FIND BASE L LEVELS DOWN*/
  while (L>0) { B1=S[B1]; L=L-1; }
  return B1;
} /*BASE*/
//---------------------------------------------------------------------------
void Interpret() {
  const STACKSIZE = 500;
  int P,B,T; 		/*PROGRAM BASE TOPSTACK REGISTERS*/
  INSTRUCTION I;
  int S[STACKSIZE];  	/*DATASTORE*/
  Form1->printfs("~~~ RUN PL0 ~~~");
  fprintf(FOUT,"~~~ RUN PL0 ~~~\n");
  T=0; B=1; P=0;
  S[1]=0; S[2]=0; S[3]=0;
  do {
    I=CODE[P]; P=P+1;
    switch (I.F) {
      case LIT: T++; S[T]=I.A; break;
	  case OPR:
	    switch (I.A) { /*OPERATOR*/
	      case 0: /*RETURN*/ T=B-1; P=S[T+3]; B=S[T+2]; break;
	      case 1: S[T]=-S[T];  break;
	      case 2: T--; S[T]=S[T]+S[T+1];   break;
	      case 3: T--; S[T]=S[T]-S[T+1];   break;
	      case 4: T--; S[T]=S[T]*S[T+1];   break;
	      case 5: T--; S[T]=S[T] % S[T+1]; break;
	      case 6: S[T]=(S[T]%2!=0);        break;
	      case 8: T--; S[T]=S[T]==S[T+1];  break;
	      case 9: T--; S[T]=S[T]!=S[T+1];  break;
	      case 10: T--; S[T]=S[T]<S[T+1];   break;
	      case 11: T--; S[T]=S[T]>=S[T+1];  break;
	      case 12: T--; S[T]=S[T]>S[T+1];   break;
	      case 13: T--; S[T]=S[T]<=S[T+1];  break;
	      case 14: Form1->printls("",S[T]); fprintf(FOUT,"%d\n",S[T]); T--;
                   break;
	      case 15: /*Form1->printfs(""); fprintf(FOUT,"\n"); */ break;
	      case 16: T++;  S[T]=InputBox("輸入","請(qǐng)鍵盤(pán)輸入:", 0).ToInt();
                   Form1->printls("? ",S[T]); fprintf(FOUT,"? %d\n",S[T]);
		           break;
	    }
	    break;
      case LOD: T++; S[T]=S[BASE(I.L,B,S)+I.A]; break;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品视频一区 二区 三区| 精品一区二区精品| 青青草国产成人av片免费| 黄页视频在线91| 99视频在线精品| 欧美日韩情趣电影| 久久久www成人免费毛片麻豆| 国产精品乱码久久久久久| 亚洲综合免费观看高清完整版在线| 日本成人在线网站| 欧美一区二区在线看| 国产婷婷色一区二区三区 | 久久99精品久久只有精品| 国产成人综合亚洲网站| 欧美亚洲综合网| 久久久久久久免费视频了| 亚洲精品日韩综合观看成人91| 奇米综合一区二区三区精品视频| 丰满白嫩尤物一区二区| 欧美日韩视频在线观看一区二区三区 | 欧美成va人片在线观看| 中文字幕一区视频| 老司机午夜精品| 91国内精品野花午夜精品| 久久久久久久免费视频了| 亚洲国产一区二区视频| 高清国产午夜精品久久久久久| 欧美午夜片在线看| 亚洲国产精品99久久久久久久久| 婷婷六月综合网| 99久久亚洲一区二区三区青草| 日韩一区二区电影| 一区二区三区高清在线| 国产精品夜夜嗨| 777午夜精品免费视频| 亚洲日本在线观看| 国产激情视频一区二区三区欧美 | 亚洲人成电影网站色mp4| 精品一区二区日韩| 欧美精品 国产精品| ...av二区三区久久精品| 国产中文字幕一区| 91精品国产91久久综合桃花| 亚洲麻豆国产自偷在线| 成人黄色电影在线| 久久这里只有精品6| 日本强好片久久久久久aaa| 欧美伊人精品成人久久综合97 | 99re热这里只有精品视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲色图.com| 成人av资源网站| 国产亚洲欧美在线| 国产在线国偷精品产拍免费yy| 欧美男男青年gay1069videost | 欧美日韩国产大片| 亚洲精品视频在线| 成人一级片在线观看| 久久九九影视网| 国产在线播放一区二区三区| 日韩欧美中文字幕公布| 日欧美一区二区| 欧美区在线观看| 亚洲风情在线资源站| 欧美自拍偷拍一区| 夜夜揉揉日日人人青青一国产精品| 99九九99九九九视频精品| 国产情人综合久久777777| 国产成人精品一区二区三区网站观看| 精品国产不卡一区二区三区| 久久成人羞羞网站| 久久亚洲二区三区| 国产成人精品免费| 亚洲国产精品黑人久久久| 成人黄色大片在线观看| 国产精品美女www爽爽爽| 成人v精品蜜桃久久一区| 国产精品美女久久久久久久久久久| 国产99久久久国产精品潘金| 国产欧美日韩视频在线观看| 大桥未久av一区二区三区中文| 国产精品入口麻豆原神| 91在线视频播放地址| 亚洲欧洲综合另类在线| 日本二三区不卡| 香蕉av福利精品导航| 欧美一区日本一区韩国一区| 蜜臀精品久久久久久蜜臀| www久久久久| 成人网在线播放| 一区二区三区四区乱视频| 欧美亚洲综合久久| 蜜臀久久99精品久久久久宅男| 精品国产欧美一区二区| 岛国精品在线播放| 一区二区三区在线免费视频| 7777精品伊人久久久大香线蕉 | 91蜜桃网址入口| 亚洲午夜三级在线| 日韩视频一区二区| 国产黄色精品网站| 亚洲欧美视频在线观看视频| 欧美日韩亚洲综合一区二区三区 | 精品乱人伦小说| 国产精品中文字幕欧美| 亚洲图片激情小说| 欧美电影一区二区| 国产高清精品网站| 一区二区三区四区国产精品| 日韩一区二区三区精品视频| 国产在线精品一区二区不卡了| 国产精品美女久久久久aⅴ| 欧美综合亚洲图片综合区| 精品在线一区二区三区| 日韩一区在线看| 欧美日本一区二区| 国产精品亚洲综合一区在线观看| 日韩一区二区在线播放| 成人涩涩免费视频| 五月婷婷综合网| 欧美国产日韩精品免费观看| 欧美在线视频你懂得| 国产精品一区二区久激情瑜伽| 亚洲精品中文在线观看| 欧美刺激脚交jootjob| 97精品国产露脸对白| 麻豆成人综合网| ●精品国产综合乱码久久久久 | 久久国产尿小便嘘嘘尿| 中文字幕亚洲区| 欧美电视剧免费全集观看| 色成人在线视频| 国产一区二区三区综合| 亚洲国产一区二区视频| 亚洲国产精品传媒在线观看| 91精品国产综合久久精品| 99国产精品国产精品毛片| 久久不见久久见中文字幕免费| 一区二区成人在线观看| 国产亚洲自拍一区| 91麻豆精品国产91| 色婷婷久久久综合中文字幕| 国产麻豆视频精品| 日韩av电影一区| 一区二区免费看| 国产精品久久久久久久久久久免费看| 日韩一本二本av| 欧美性三三影院| 91在线免费播放| 国产91色综合久久免费分享| 免费成人在线视频观看| 一区二区激情小说| 亚洲色图在线视频| 亚洲国产精品传媒在线观看| 精品国产乱码久久久久久久| 欧美久久一区二区| 在线精品观看国产| 97久久精品人人澡人人爽| 国产精品18久久久久久久久久久久| 日韩中文字幕av电影| 亚洲精品免费播放| 亚洲柠檬福利资源导航| 国产精品婷婷午夜在线观看| 精品少妇一区二区| 日韩视频在线观看一区二区| 欧美日韩成人综合天天影院| 欧美综合视频在线观看| 色94色欧美sute亚洲线路二| av在线这里只有精品| 丰满白嫩尤物一区二区| 国产高清在线精品| 国产精品18久久久久久vr| 国产自产视频一区二区三区| 久久爱另类一区二区小说| 青娱乐精品视频在线| 日本中文字幕一区二区有限公司| 亚洲小说春色综合另类电影| 亚洲精品免费在线观看| 玉米视频成人免费看| 亚洲美女屁股眼交| 一区二区三区在线免费播放| 一区二区三区中文字幕在线观看| 亚洲免费伊人电影| 亚洲美女视频在线| 亚洲制服丝袜av| 亚洲成人免费视频| 日本特黄久久久高潮| 奇米888四色在线精品| 蜜桃视频在线观看一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩成人午夜电影| 麻豆国产欧美日韩综合精品二区 | 国产欧美日韩视频在线观看| 中文字幕第一区第二区| 国产精品第一页第二页第三页 | 色噜噜狠狠成人中文综合| 欧洲人成人精品| 7777精品伊人久久久大香线蕉超级流畅 | 欧美乱妇15p| 777久久久精品|