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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tm.cpp

?? 編譯原理學習使用的代碼 內容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/********** 該代碼文件所包含頭文件 ***********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* 宏定義常量TRUE為1 */
#ifndef TRUE
#define TRUE 1
#endif
/* 宏定義常量FALSE為0 */
#ifndef FALSE
#define FALSE 0
#endif


/******************* 常量 ********************/

/* 為大型程序擴展,指令存儲區大小,定義為1024 */
#define   IADDR_SIZE  1024 
/* 為大型程序擴展,數據存儲區大小,定義為1024 */
#define   DADDR_SIZE  1024 
/* 寄存器數量,定義為8 */
#define   NO_REGS 8
/* PC寄存器,定義為7 */
#define   PC_REG  7
/* 目標代碼行大小,定義為121 */
#define   LINESIZE  121
/* 字大小,定義為20 */
#define   WORDSIZE  20


/**************** 類型 *******************/

/* 指令尋址模式類型 */
typedef enum 
{
   opclRR,		/* 寄存器尋址模式類型,操作數使用寄存器r,s,t */
   opclRM,		/* 寄存器-內存尋址模式類型,操作數使用寄存器r,內存地址d+s */
   opclRA		/* 寄存器-立即數尋址模式類型,操作數使用寄存器r,立即數值d+s */
} OPCLASS;

/* 操作指令標識碼類型 */
typedef enum opcode{

   /************* 寄存器尋址模式指令標識碼 ***************/

   opHALT,	/* 停止指令:結束程序執行,忽略操作數 */
   
   opIN,	/* 輸入指令:將外部變量讀入寄存器,使用第r個寄存器,忽略s,t參數 */

   opOUT,	/* 輸出指令:將寄存器的值輸出,使用第r個寄存器,忽略s,t參數 */

   opADD,   /* 加法指令:寄存器r的值賦為寄存器s的值與寄存器t的值的和 */

   opSUB,   /* 減法指令:寄存器r的值賦為寄存器s的值與寄存器t的值的差 */

   opMUL,   /* 乘法指令:寄存器r的值賦為寄存器s的值與寄存器t的值的積 */

   opDIV,   /* 除法指令:寄存器r的值賦為寄存器s的值與寄存器t的值的商 */

   /* 寄存器尋址模式指令限制標志,							*
    * 操作標識碼枚舉值小于opRRLim的指令均為寄存器尋址模式指令	*/
   opRRLim,  

   /************** 寄存器-內存尋址模式指令標識碼 ****************/

   opLD,	/* 載入指令:寄存器r的值賦為地址為d+reg(s)的內存單元的值 */

   opST,    /* 設置指令:將地址為d+reg(s)的內存單元值賦為寄存器r的值 */

   /* 寄存器-內存尋址模式指令限制標志										*
    * 操作標識碼枚舉值小于opRMLim且大于opRRLim的均為寄存器-內存尋址模式指令 */
   opRMLim, 

  
   /************* 寄存器-立即數尋址模式指令標識碼 ****************/

   opLDA,	/* 載入指令:將寄存器r的值賦為立即數d與寄存器s的值的和 */

   opLDC,   /* 載入指令:將寄存器r的值賦為立即數d,參數s被忽略 */

   opJLT,   /* 如果寄存器r的值小于0,將第7個寄存器的值賦為d+reg(s)	*
			 * 第7個寄存器為pc程序計數寄存器						*/

   opJLE,   /* 如果寄存器r的值小于等于0,將pc寄存器的值賦為d+reg(s) */

   opJGT,   /* 如果寄存器r的值大于0,將pc寄存器的值賦為d+reg(s) */

   opJGE,   /* 如果寄存器r的值大于等于0,將pc寄存器的值賦為d+reg(s) */

   opJEQ,   /* 如果寄存器r的值等于0,將pc寄存器的值賦為d+reg(s) */

   opJNE,   /* 如果寄存器r的值不等于0,將pc寄存器的值賦為d+reg(s) */

   /* 寄存器-立即數尋址模式指令限制標志
    * 操作標識碼枚舉值小于opRALim且大于opRMLim的均為寄存器-立即數尋址模式指令 */
   opRALim    

   } OPCODE;						

/************ 指令單步執行結果類型 ************/
typedef enum {
   srOKAY,			/* 正常 */

   srHALT,			/* 停止 */

   srIMEM_ERR,		/* 指令存儲錯 */

   srDMEM_ERR,		/* 數據存儲錯 */

   srZERODIVIDE		/* 除數為零錯 */

   } STEPRESULT;

/* 指令結構類型:操作碼,操作數1,操作數2,操作數3 */
typedef struct {
      int iop  ;
      int iarg1  ;
      int iarg2  ;
      int iarg3  ;
   } INSTRUCTION;


/******** 變量 ********/

int iloc = 0 ;			/* 指令存儲計數指針,初始為0 */

int dloc = 0 ;			/* 數據存儲計數指針,初始為0 */

int traceflag = FALSE;	/* 指令執行追蹤標志,初始為FALSE */

int icountflag = FALSE;	/* 指令執行計數標志,初始為FALSE */

/* iMem用于指令存儲,為1024長的指令結構數組 */
INSTRUCTION iMem [IADDR_SIZE];				

/* dMem用于數據存儲,為1024長的整數類型數組 */
int dMem [DADDR_SIZE];						

/* reg用于寄存器存儲,為8長的整數類型數組 */
int reg [NO_REGS];							


/* 指令操作碼表,對應尋址模式分為三類 */
char * opCodeTab[]

        = {"HALT","IN","OUT","ADD","SUB","MUL","DIV","????",
          /* 寄存器尋址模式指令類型 */

           "LD","ST","????", 
		  /* 寄存器-內存尋址模式指令類型 */

           "LDA","LDC","JLT","JLE","JGT","JGE","JEQ","JNE","????"
          /* 寄存器-立即數尋址模式指令類型 */
          };

/** 單步執行結果狀態表 **/
char * stepResultTab[]

        = {"OK","Halted","Instruction Memory Fault",
           "Data Memory Fault","Division by 0"
          };

char pgmName[20];			/* 用于存儲程序文件名 */

FILE *pgm  ;				/* 程序文件指針 */

char in_Line[LINESIZE] ;	/* 用于存儲一行代碼,為121長的字符數組 */

int lineLen ;				/* in_Line中行結尾字符位置 */

int inCol  ;				/* 用于指出在in_Line中的當前字符位置 */

int num  ;					/* 用于存儲當前所得數值 */

char word[WORDSIZE] ;		/* 用于存儲當前的字,為20長的字符數組 */

char ch  ;					/* 當前代碼行中當前位置上的字符 */

int done  ;



/****************************************************/
/* 函數名 opClass									*/
/* 功  能 指令尋址模式分類函數						*/
/* 說  明 該函數對給定的指令操作碼枚舉值c進行分類	*/
/*        返回指令所屬尋址模式						*/
/****************************************************/
int opClass( int c )

{ 
  /* 如果枚舉值c小于opRRLim,則指令為寄存器尋址模式指令類型 */
  if      ( c <= opRRLim) return ( opclRR );

  /* 如果枚舉值c小于opRMLim,則指令為寄存器-內存尋址模式指令類型 */
  else if ( c <= opRMLim) return ( opclRM );

  /* 為寄存器-立即數尋址模式指令類型 */
  else                    return ( opclRA );

} 

/********************************************************/
/* 函數名 writeInstruction								*/
/* 功  能 指令輸出函數									*/
/* 說  明 該函數將指令存儲區中指令以指定格式輸出到屏幕	*/
/********************************************************/
void writeInstruction ( int loc )

{  
  /* loc為所要輸出的指令在指令存儲區中地址,輸出到屏幕 */
  printf( "%5d: ", loc) ;

  /* 輸出指令地址loc在0-1023有效的指令存儲區地址范圍之內 */
  if ( (loc >= 0) && (loc < IADDR_SIZE) )

  { 
    /* 輸出地址為loc上的指令操作碼值iMem[loc].iop和第一操作數iMem[loc].iarg1 */
	printf("%6s%3d,", opCodeTab[iMem[loc].iop], iMem[loc].iarg1);

	/* 根據指令的尋址模式分類處理 */
    switch ( opClass(iMem[loc].iop) )

    { 
      /* 輸出指令為寄存器尋址模式指令,以給定形式輸出操作數2,操作數3 */
	  case opclRR: printf("%1d,%1d", iMem[loc].iarg2, iMem[loc].iarg3);
                   break;		

      /* 輸出指令為寄存器-立即數尋址模式指令,和寄存器-內存尋址模式指令	*
	   * 以給定形式輸出操作數2,操作數3									*/
      case opclRM: 
      case opclRA: printf("%3d(%1d)", iMem[loc].iarg2, iMem[loc].iarg3);
                   break;	
    }
   	/* 向屏幕輸出換行符 */
	printf ("\n") ;
  }
} /* writeInstruction */

/****************************************************/
/* 函數名 getCh										*/
/* 功  能 字符獲取函數								*/
/* 說  明 如果當前行中字符未讀完,則函數返回當前字符	*/
/*		  否則,函數返回空格字符						*/
/****************************************************/
void getCh (void)

{ 
  /* 在當前代碼行in_Line中,當前字符列數inCol未超過代碼行實際長度lineLen *
   * 取得當前行中當前位置的字符,送入ch									*/
  if (++inCol < lineLen)
  ch = in_Line[inCol] ;

  /* 如果inCol超出當前代碼行長度范圍,則ch賦為空格 */
  else ch = ' ' ;

} /* getCh */



/********************************************************/
/* 函數名 nonBlank										*/
/* 功  能 非空字符獲取函數								*/
/* 說  明 如果成功從當前行中取得非空字符,函數返回TRUE	*/
/*		  否則,函數返回FALSE							*/
/********************************************************/
int nonBlank (void)

{ 
  /* 在當前代碼行in_Line中,當前字符位置inCol中為空格字符	*  
   * 在當前代碼行in_Line中,當前字符位置inCol下移,略過空格	*/
  while ((inCol < lineLen)
         && (in_Line[inCol] == ' ') )
		 inCol++ ;

  /* 在當前代碼行in_Line中,遇到非空字符 */
  if (inCol < lineLen)

  { 
    /* 取當前字符位置inCol中的字符送入ch,		*
	 * 函數返回TRUE(已定義為1),ch中得到非空字符	*/
	ch = in_Line[inCol] ;
    return TRUE ; }

  /* 當前代碼行已經讀完,將當前字符ch 賦為空格,	*
   * 函數返回FALSE(已定義為0),ch中為空格字符	*/
  else
  { ch = ' ' ;
    return FALSE ; }
} /* nonBlank */


/****************************************************************/
/* 函數名 getNum												*/
/* 功  能 數值獲取函數											*/
/* 說  明 將代碼行中連續出現的有加減運算的數term合并計數,		*/
/*        所的數值送入為num.如果成功得到數值,則函數返回TRUE;	*/
/*        否則,函數返回FALSE									*/
/****************************************************************/
int getNum (void)

{ int sign;				/* 符號因子 */

  int term;				/* 用于記錄當前錄入的局部數值 */

  int temp = FALSE;		/* 記錄函數返回值,初始為假 */

  num = 0 ;				/* 用于記錄所有加減運算后的最終數值結果 */

  do
  { sign = 1;			/* 符號因子初始為1 */

    /* 調用函數nonBlank()略過當前位置的空格后,			*
     * 所得到的當前非空字符ch為+或-.(+/-的連續出現處理)	*/
    while ( nonBlank() && ((ch == '+') || (ch == '-')) )

    { temp = FALSE ;

	  /* 當前字符ch為"-"時,符號因子sign設為-1 */
	  if (ch == '-')  sign = - sign ;

	  /* 取當前代碼行中下一字符到當前字符ch中 */
      getCh();
    }

    term = 0 ;		/* 當前錄入的局部數值初始為0 */

    nonBlank();		/* 略過當前位置上的空格 */

	/* 當前字符ch為數字,局部數值的循環處理 */
    while (isdigit(ch))				

    { temp = TRUE ;		/* 函數返回值設為TRUE,成功得到數字 */

	  /* 將字符序列轉化為數值形式,進行進位累加 */
      term = term * 10 + ( ch - '0' ) ;

      getCh();			/* 取當前代碼行中下一字符到當前字符ch中 */

    }
	/* 將局部數值帶符號累加,得到最終數值num */
    num = num + (term * sign) ;

  } while ( (nonBlank()) && ((ch == '+') || (ch == '-')) ) ;
  return temp;
} /* getNum */


/****************************************************/
/* 函數名 getWord									*/
/* 功  能 單詞獲取函數								*/
/* 說  明 函數從當前代碼行中獲取單詞.如果得到字符,	*/
/*		  則函數返回TRUE;否則,函數返回FALSE			*/
/****************************************************/
int getWord (void)

{ 
	
  int temp = FALSE;			/* 函數返回值初始為FALSE */

  int length = 0;			/* 單詞長度初始為0 */

  /* 在當前代碼行中成功獲取非空字符ch */
  if (nonBlank ())

  {
    /* 當前非空字符ch為字母或數字 */
	while (isalnum(ch))

    {
      /* 當前單詞word未超過規定字長WORDSIZE-1(為單詞結束字符留一空位)	*
	   * 將當前字符ch讀入到單詞末尾										*/
	  if (length < WORDSIZE-1) word [length++] =  ch ;

      getCh() ;			/* 取當前代碼行中下一字符 */
    }

	/* 給當前單詞word加入結束字符 */
    word[length] = '\0';

	/* 設置函數返回值,當讀入字word非空的時候為TRUE */
    temp = (length != 0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美在线观看| 日韩精品电影一区亚洲| 久久久精品综合| 国产女同性恋一区二区| 在线综合视频播放| 7777精品久久久大香线蕉| 欧美一区二区三区电影| 欧美大白屁股肥臀xxxxxx| 精品国产一二三| 国产精品美女久久久久久2018 | 欧美中文字幕一区| 色一情一乱一乱一91av| 欧美三级电影在线看| 欧美成人三级电影在线| 国产精品嫩草影院av蜜臀| 亚洲欧美成人一区二区三区| 日日噜噜夜夜狠狠视频欧美人 | 精品美女在线播放| 中文字幕一区二区在线观看| 亚洲一区二区中文在线| 麻豆精品一区二区综合av| 国产大片一区二区| 91麻豆精品国产91久久久使用方法| 日韩一区二区三区免费观看 | 国产一区二区免费看| 日本久久电影网| 亚洲精品在线观| 婷婷开心久久网| 日本精品一区二区三区四区的功能| 欧美一区二区三区四区在线观看 | 99久久精品国产导航| 欧美电视剧免费全集观看| 一区二区三区精密机械公司| 久久国产人妖系列| 91精品久久久久久久99蜜桃| 亚洲精品视频观看| 色诱亚洲精品久久久久久| 久久蜜臀精品av| 国产精品99久久久久久有的能看| 日韩一级黄色大片| 免费观看一级欧美片| 91精品国产丝袜白色高跟鞋| 亚洲色图制服丝袜| 色婷婷av久久久久久久| 亚洲欧洲另类国产综合| 99re亚洲国产精品| 亚洲女性喷水在线观看一区| 99久免费精品视频在线观看| 亚洲欧洲国产日韩| 在线免费精品视频| 男人操女人的视频在线观看欧美| 欧美特级限制片免费在线观看| 欧美一区二区久久久| 午夜婷婷国产麻豆精品| 欧美军同video69gay| 欧美亚洲愉拍一区二区| 成人ar影院免费观看视频| 色婷婷久久一区二区三区麻豆| 欧美国产欧美综合| 国产精华液一区二区三区| 久久久久久97三级| 国产成人8x视频一区二区| 国产午夜精品一区二区三区四区| 国产精品一色哟哟哟| 中文字幕中文字幕在线一区 | 国产精品另类一区| 日本三级韩国三级欧美三级| 欧美精品在线一区二区| 国产一区二区三区日韩 | 一区二区三区影院| 国产综合久久久久久久久久久久| 久久综合视频网| 99久久精品国产观看| 日韩精彩视频在线观看| 国产亚洲人成网站| 欧美精品久久久久久久久老牛影院| 奇米影视一区二区三区| 中文字幕一区日韩精品欧美| 在线不卡中文字幕播放| 91丨九色丨蝌蚪丨老版| 蜜臀久久99精品久久久久久9| 欧美精品一区二区高清在线观看| 高清国产一区二区| 日本不卡不码高清免费观看| 国产精品天干天干在线综合| 欧美一卡2卡三卡4卡5免费| 99riav一区二区三区| 国产乱人伦偷精品视频免下载 | 亚洲精品国产一区二区精华液 | av一区二区三区四区| 制服丝袜在线91| av一二三不卡影片| eeuss影院一区二区三区| 日韩电影免费在线看| 五月综合激情婷婷六月色窝| 亚洲欧美综合色| 欧美激情一区二区三区全黄| 久久综合色鬼综合色| 日韩欧美一区在线| 精品国产乱码久久久久久久| 日韩一级大片在线观看| 精品国产一区二区三区久久影院| 欧美日韩免费一区二区三区视频| 欧美亚洲免费在线一区| 欧美视频一区二区三区四区| 波多野结衣中文字幕一区| 国产麻豆视频一区二区| 中文字幕一区av| 亚洲精品视频在线看| 天涯成人国产亚洲精品一区av| 亚洲午夜国产一区99re久久| 午夜精品成人在线视频| 秋霞国产午夜精品免费视频| 久久不见久久见免费视频7| 极品美女销魂一区二区三区 | 91小视频在线| 欧美一区二区三区在线视频| 精品久久人人做人人爰| 国产精品毛片高清在线完整版| 日韩一区二区在线免费观看| 国产高清一区日本| 欧洲视频一区二区| 久久久精品免费网站| 国产精品久久久久影院| 狠狠色综合日日| 欧美亚洲自拍偷拍| 中文字幕av一区 二区| 日韩在线卡一卡二| 国产丶欧美丶日本不卡视频| 欧美日韩免费观看一区二区三区| 久久久精品2019中文字幕之3| 亚洲香蕉伊在人在线观| 粉嫩久久99精品久久久久久夜| 欧美乱熟臀69xxxxxx| 亚洲人成网站在线| 国产福利一区在线观看| 精品成人私密视频| 婷婷开心久久网| 欧美人牲a欧美精品| 亚洲免费av在线| 91在线视频网址| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲va欧美va天堂v国产综合| 丰满放荡岳乱妇91ww| 欧美精品一区二区精品网| 久久精品99国产国产精| 精品日韩av一区二区| 日本三级亚洲精品| 日韩欧美高清在线| 韩国一区二区在线观看| 久久婷婷国产综合精品青草 | 三级久久三级久久久| av亚洲精华国产精华| 国产精品久久久久久妇女6080| 亚洲激情第一区| 欧美剧在线免费观看网站| 婷婷久久综合九色综合伊人色| 欧美日韩不卡一区| 亚洲成人动漫在线观看| 91麻豆精品91久久久久久清纯 | 欧美极品美女视频| 国产精品国产成人国产三级 | 极品美女销魂一区二区三区| 一本大道av一区二区在线播放| 中文字幕一区免费在线观看| 日韩高清一区二区| 成人免费精品视频| 亚洲男人的天堂在线aⅴ视频| 波多野结衣亚洲| 亚洲成人777| 久久九九久久九九| av日韩在线网站| 精品一区二区三区免费毛片爱| 国产欧美精品国产国产专区| 欧美三区在线视频| 国产99精品视频| 国内一区二区在线| 亚洲午夜精品17c| 综合自拍亚洲综合图不卡区| 欧美精品一区二区三区很污很色的| 色婷婷国产精品久久包臀| 高清beeg欧美| 国产精品综合在线视频| 精品在线免费观看| 精品亚洲免费视频| 美女久久久精品| 三级影片在线观看欧美日韩一区二区| 国产精品国产三级国产aⅴ原创| 欧美精三区欧美精三区| 欧美日韩国产在线播放网站| 在线免费精品视频| 欧美猛男超大videosgay| 精品视频一区二区三区免费| 99re66热这里只有精品3直播 | 国产成人免费9x9x人网站视频| 蜜臀av性久久久久蜜臀aⅴ | 日韩高清中文字幕一区| 午夜国产精品一区| 青青草一区二区三区| 日本一区二区三区在线不卡|