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

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

?? pl0.cpp

?? 用C實現的PL0的編譯器的原代碼,弄鏈表實現了關鍵字的補充
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "stdarg.h"

#define NORW       20     // 保留字的個數
#define TXMAX      100    // 標識符表的長度
#define MAXNUMLEN  14     // 數字的最長位數
#define MAXIDLEN   10     // 標識符最長長度
#define MAXADDRESS 2047   // 尋址空間
#define MAXLEVEL   3      // 最大允許的塊嵌套層數
#define CXMAX      200    // 類PCODE目標代碼數組長度
#define NSYM       10     // 符號的個數
#define MAXSYM     30     // symbols的最大個數 
#define STACKSIZE  500    // 常量定義,假想的棧式計算機有500個棧單元
#define MAXINS     10

enum idtype  //idtype標識符的類型
{
	ID_CONSTANT, ID_VARIABLE, ID_PROCEDURE
};
enum opcode  //opcode類型分別標識類PCODE的各條指令 
{
	LIT, OPR, LOD, STO, CAL, INT, JMP, JPC, RED, WRT
};
enum oprcode
{
	OPR_RET, OPR_NEG, OPR_ADD, OPR_MIN,
	OPR_MUL, OPR_DIV, OPR_ODD, OPR_EQU,
	OPR_NEQ, OPR_LSS, OPR_LEQ, OPR_GTR,
	OPR_GEQ
};
enum symtype  //symset是symbol類型的一個集合類型,可用于存放一組symbol,symobl類型標識了不同類型的詞匯
{
	SYM_NULL,            // 0
	SYM_IDENTIFIER,      // 1
	SYM_NUMBER,          // 2
	SYM_PLUS,            // 3  +
	SYM_MINUS,           // 4  -
	SYM_TIMES,           // 5  *
	SYM_SLASH,           // 6  /
	SYM_ODD,             // 7  odd
	SYM_EQU,             // 8  =
	SYM_NEQ,             // 9  <>
	SYM_LSS,             // 10 < 
	SYM_LEQ,             // 11 <=
	SYM_GTR,             // 12 >
	SYM_GEQ,             // 13 >=
	SYM_LPAREN,          // 14 (
	SYM_RPAREN,          // 15 )
	SYM_COMMA,           // 16 ,
	SYM_SEMICOLON,       // 17 ;
	SYM_PERIOD,          // 18 .
	SYM_BECOMES,         // 19 :=
    SYM_BEGIN,           // 20 begin
	SYM_END,             // 21 end
	SYM_IF,              // 22 if
	SYM_THEN,            // 23 then
	SYM_WHILE,           // 24 while
	SYM_DO,              // 25 do
	SYM_CALL,            // 26 call
	SYM_CONST,           // 27 const
	SYM_VAR,             // 28 var
	SYM_PROCEDURE,       // 29 procedure
	SYM_READ,            // 30 read
	SYM_WRITE,           // 31 write
	SYM_ELSE,            // 32 else
    SYM_DOWNTO,          // 33 downto
	SYM_BY,              // 34 by
	SYM_TO,              // 35 to
	SYM_FOR,             // 36 for
	SYM_REPEAT,          // 37 repeat
	SYM_UNTIL            // 38 until	
};
typedef struct  //類PCODE指令類型,包含三個字段:指令f、層差l和另一個操作數a 
{
	int f; // 指令
	int l; // 層差
	int a; // 操作數
} instruction;

/*************************************************************************/
char* err_msg[] =
{
/*  0 */    "",
/*  1 */    "常數說明中的\"=\"寫成\":=\"!",
/*  2 */    "常數說明中的\"=\"后應是數字!",
/*  3 */    "常數說明中標識符后應是\"=\"!",
/*  4 */    "'const', 'var', 'procedure'后應為標識符!",
/*  5 */    "漏掉了\',\' 或\';\'!",
/*  6 */    "過程說明后的符號不正確(應是語句開始符,或過程定義符)!",
/*  7 */    "應是語句開始符!",
/*  8 */    "程序體內語句部分后的符號不正確!",
/*  9 */    "程序結尾丟了句號\'.\'!",
/* 10 */    "語句之間漏';'!",
/* 11 */    "標識符未說明!",
/* 12 */    "賦值語句中, 賦值號左部標識符屬性應是變量,不可向常量或過程賦值!",
/* 13 */    "賦值語句左部標識符后應是賦值號\':=\'!",
/* 14 */    "'call'后應為標識符!",
/* 15 */    "不可調用常量或變量.",
/* 16 */    "條件語句中丟了\'then\'!",
/* 17 */    "丟了\'end\' 或\';\'!",
/* 18 */    "while 型循環語句中丟了\'do\'!",
/* 19 */    "語句后的符號不正確!",
/* 20 */    "應為關系運算符!",
/* 21 */    "表達式內標識符屬性不能是過程!",
/* 22 */    "表達式中漏掉右括號\')\'!",
/* 23 */    "因子后的非法符號!",
/* 24 */    "表達式不能以此符號開始!",
/* 25 */    "“for”后應為變量標識符",
/* 26 */    "缺少“to”或“downto”",		
/* 27 */    "應為“do”或“by”",
/* 28 */    "應為“do”",
/* 29 */    "repeat 型循環語句中沒有until!",
/* 30 */    "數值過大",
/* 31 */    "編譯器溢出",
/* 32 */    "過程嵌套過深",
/* 33 */    "read語句括號中的標識符不是變量!",
/* 34 */    "應當為右括號",
/* 35 */    "應為負數",
/* 36 */    "應為正數",
/* 40 */	"應當為左括號"
};


/*************************************************************************/

//全局變量定義
char ch;         // 主要用于詞法分析器,存放最近一次從文件中讀出的字符
int  sym;        // 詞法分析器輸出結果之用,存放最近一次識別出來的token的類型
char id[MAXIDLEN + 1]; // 詞法分析器輸出結果之用,存放最近一次識別出來的標識符的名字
int  num;        // d詞法分析器輸出結果之用,存放最近一次識別出來的數字的值
int  cc;         // 行緩沖區指針
int  ll;         // 行緩沖區長度
int  err;
int  cx;         //代碼分配指針,代碼生成模塊總在cx所指位置生成新的代碼
int  level = 0;
int  tx = 0;
char line[80];  //行緩沖區,用于從文件讀出一行,供詞法分析獲取單詞時之用
int  dx;        //全局變量
instruction code[CXMAX];  //生成的類PCODE代碼表,存放編譯得到的類PCODE代碼

char* word[NORW +1] =  //保留字表
{
	"","begin", "call", "const", "do", "end",
    "if","odd", "procedure", "then", "var", "while",
	"read", "write", "else","downto","by","to","for", 
	"repeat", "until"
};

int wsym[NORW +1] =  //保留字表中每一個保留字對應的symbol類型 
{
	SYM_NULL, SYM_BEGIN, SYM_CALL, SYM_CONST, SYM_DO, SYM_END,
	SYM_IF, SYM_ODD, SYM_PROCEDURE, SYM_THEN, SYM_VAR, SYM_WHILE,
    SYM_READ, SYM_WRITE, SYM_ELSE,SYM_DOWNTO,SYM_BY,SYM_TO,SYM_FOR,
	SYM_REPEAT,	SYM_UNTIL
};

int ssym[NSYM + 1] = //一些符號對應的symbol類型表
{
	SYM_NULL, SYM_PLUS, SYM_MINUS, SYM_TIMES, SYM_SLASH,
	SYM_LPAREN, SYM_RPAREN, SYM_EQU, SYM_COMMA, SYM_PERIOD,	SYM_SEMICOLON 
};

char csym[NSYM + 1] =
{
	' ', '+', '-', '*', '/', '(', ')', '=', ',', '.', ';'
};

char* mnemonic[MAXINS] =
{
	"LIT", "OPR", "LOD", "STO", "CAL", "INT", "JMP", "JPC", "RED", "WRT"
};

typedef struct
{
	char name[MAXIDLEN + 1];
	int  kind;
	int  value;
} comtab;

comtab table[TXMAX];

typedef struct
{
	char  name[MAXIDLEN + 1];
	int   kind;
	short level;
	short address;
} mask;

FILE* infile, *outfile;//in文本文件用于指向輸入的源程序文件,out程序中沒有用到

typedef struct snode
{
	int elem;
	struct snode* next;
}snode, *symset;

symset phi, declbegsys, statbegsys, facbegsys, relset;  //定義的結構體symset的變量

symset uniteset(symset s1, symset s2)
{
	symset s;
	snode* p;	
	s = p = (snode*) malloc(sizeof(snode));
	s1 = s1->next; 
	s2 = s2->next; 	
	while (s1 && s2)
	{
		p->next = (snode*) malloc(sizeof(snode));
		p = p->next;
		if (s1->elem < s2->elem)
		{
			p->elem = s1->elem;
			s1 = s1->next;
		}
		else
		{
			p->elem = s2->elem;
			s2 = s2->next;
		}
	}	
	if (s2)	
		s1 = s2;
	while (s1)
	{
		p->next = (snode*) malloc(sizeof(snode));
		p = p->next;
		p->elem = s1->elem;
		s1 = s1->next;
		
	}
	p->next = NULL;
	return s;
} 

void setinsert(symset s, int elem)
{
	snode* p = s;
	snode* q;
	while (p->next && p->next->elem < elem)
		p = p->next;	
	q = (snode*) malloc(sizeof(snode));
	q->elem = elem;
	q->next = p->next;
	p->next = q;
}

symset createset(int elem, ...)
{
	va_list list;
	symset s;
	s = (snode*) malloc(sizeof(snode));
	s->next = NULL;
	va_start(list, elem);
	while (elem)
	{
		setinsert(s, elem);
		elem = va_arg(list, int);
	}
	va_end(list);
	return s;
}

void destroyset(symset s) //釋放空間
{
	snode* p;
	while (s)
	{
		p = s;
		s = s->next;
		free(p);
	}
} 

int inset(int elem, symset s)
{
	s = s->next;
	while (s && s->elem < elem)
		s = s->next;
	if (s && s->elem == elem)
		return 1;
	else
		return 0;
} 


void showset(symset s) //輸出
{
	s = s->next;
	while (s)
	{
		printf("%d,", s->elem);
		s = s->next;
	}
	printf("\n");
} 


/*************************************************************************/
void error(int);                                    //出錯處理
void getsym(void);                                  //詞法分析,讀取一個單詞
void getch(void);                                   //讀取字符
void gen(int, int, int);                            //生成Pcode指令,送入目標程序區
void listcode(int, int);                            //列出Pcode指令清單
void test(symset, symset, int n);                   //測試當前單詞符號是否合法 
void enter(int);                                    //登錄名字表
int  position(char*);                               //查找標識符在名字表中的位置
void constdeclaration();                            //常量定義處理
void vardeclaration(void);                          //變量說明處理
void block(symset fsys);                            //分程序分析處理
void statement(symset);                             //語句部分分析處理
void expression(symset);                            //表達式分析處理
void term(symset);                                  //項分析處理
void factor(symset);                                //因子分析處理
void condition(symset);                             //條件分析處理
void interpret();                                   //Pcode解釋執行程序
int base(int stack[], int, int);                    //通過靜態鏈求出數據區的基地址



/*************************************************************************/
int main ()     //主程序
{
	char s[80],*finddot;
	//int i;
	symset set0, set1, set2;
	printf("請輸入要編譯的源文件名(文件名+文件后綴): ");
	scanf("%s", s);
	if ((infile = fopen(s, "r")) == NULL)  //判斷讀入文件是否為空
	{
		printf("文件 %s 不能打開!\n", s);
		exit(1);
	}
	finddot = strchr(s,'.');          // 打開輸出文件
	if (finddot!=NULL)
	{
		strcpy(finddot, ".out");  //將字符指針的內容拷貝到與源文件同名的后綴名為.out的文件內
	}
	else
	{
		strcat(s, ".out");
		printf("%s\n", s);
	}
	printf("輸出文件是 %s\n", s);
	if ((outfile = fopen(s, "w")) == NULL)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡视频在线看| 亚洲精品国产视频| 日本最新不卡在线| 国产在线视频不卡二| 欧美一级二级三级蜜桃| 亚洲成人动漫一区| 99久久精品国产毛片| 国产视频一区在线播放| 精品一区二区日韩| 精品国免费一区二区三区| 视频一区二区中文字幕| 欧美日本一区二区在线观看| 亚洲综合色婷婷| 在线欧美日韩国产| 亚洲精品国产a| 国产精品 欧美精品| 欧美亚洲国产一区二区三区va| 1000部国产精品成人观看| 从欧美一区二区三区| 日韩欧美在线网站| 国内精品伊人久久久久av一坑| 精品免费99久久| 美国十次综合导航| 欧美va日韩va| 国产精品一区二区无线| 久久精品一区二区三区不卡牛牛 | 欧美猛男超大videosgay| 亚洲欧美激情视频在线观看一区二区三区| 国产福利91精品一区二区三区| 欧美mv和日韩mv国产网站| 狠狠色丁香婷综合久久| 久久理论电影网| 福利视频网站一区二区三区| 国产精品美女视频| 色综合 综合色| 首页国产丝袜综合| 欧美军同video69gay| 美洲天堂一区二卡三卡四卡视频| 日韩欧美一区二区视频| 国产一区91精品张津瑜| 日韩一区在线看| 欧美精品一卡两卡| 国内精品久久久久影院色| 久久影院午夜论| 99久久er热在这里只有精品66| 亚洲午夜影视影院在线观看| 制服丝袜日韩国产| 国产另类ts人妖一区二区| 中文字幕一区二区三区不卡在线 | 亚洲欧美日韩国产综合在线| 欧美色图在线观看| 国产在线精品视频| 国产精品免费久久| 4hu四虎永久在线影院成人| 国产**成人网毛片九色 | 91精品婷婷国产综合久久性色| 狠狠狠色丁香婷婷综合久久五月| 国产精品福利影院| 欧美不卡一二三| 日本高清无吗v一区| 激情深爱一区二区| 国产精品丝袜在线| 欧美一级高清大全免费观看| 国产在线精品国自产拍免费| 亚洲黄网站在线观看| 久久精品在线观看| 久久综合99re88久久爱| 日韩色视频在线观看| 欧美日韩aaa| 欧美日韩国产在线观看| 欧美艳星brazzers| 91福利社在线观看| 日本精品一区二区三区高清 | 欧美不卡激情三级在线观看| 欧美精品99久久久**| 欧美日韩一级大片网址| 欧美性猛交xxxxxx富婆| 色诱视频网站一区| 一本久久综合亚洲鲁鲁五月天| av一区二区三区| 97久久超碰国产精品电影| 99国内精品久久| 99久久久无码国产精品| 91色婷婷久久久久合中文| 色综合久久天天| 一道本成人在线| 欧美亚洲一区二区在线| 欧美视频在线观看一区| 91麻豆精品国产自产在线 | 丁香六月综合激情| 东方aⅴ免费观看久久av| 国产不卡免费视频| 97se亚洲国产综合自在线| 色婷婷狠狠综合| 欧美日韩视频专区在线播放| 欧美丝袜自拍制服另类| 日韩一级完整毛片| 2欧美一区二区三区在线观看视频| 精品国内二区三区| 中文幕一区二区三区久久蜜桃| 国产精品美女久久久久久久久| 一区在线观看免费| 午夜不卡在线视频| 激情文学综合网| 99国产精品一区| 欧美精品乱人伦久久久久久| 日韩午夜在线观看视频| 久久久久久久久久久久电影| 国产精品三级在线观看| 亚洲已满18点击进入久久| 日韩专区欧美专区| 国产成人啪免费观看软件 | 久久精品国产免费看久久精品| 国产在线一区二区| 色综合久久综合中文综合网| 宅男噜噜噜66一区二区66| 国产午夜精品一区二区三区视频| 亚洲欧美中日韩| 日本三级韩国三级欧美三级| 国产精品亚洲成人| 欧美中文字幕不卡| 久久一区二区三区四区| 亚洲欧美一区二区三区国产精品 | 国产中文一区二区三区| 91美女蜜桃在线| 日韩精品一区二区三区四区| 日韩毛片精品高清免费| 美女视频免费一区| 91污在线观看| 欧美精品一区二区高清在线观看 | 国产精品久久久久久一区二区三区 | 蜜桃av一区二区三区电影| 成人黄页毛片网站| 日韩一区二区免费在线观看| 国产精品无人区| 另类中文字幕网| 在线观看国产91| 国产精品看片你懂得| 久久99精品久久久久久动态图 | 色天天综合色天天久久| 久久影视一区二区| 午夜不卡av在线| 91视频国产观看| 久久久精品免费免费| 亚洲国产毛片aaaaa无费看| 国产一区二三区| 欧美巨大另类极品videosbest| 国产精品色在线| 国产成人亚洲精品青草天美| 欧美一卡二卡在线| 亚洲第一成人在线| 色婷婷久久久亚洲一区二区三区| 久久天堂av综合合色蜜桃网| 亚洲午夜激情av| 在线视频欧美精品| 亚洲欧美日韩国产一区二区三区| 国产精品一区二区视频| 日韩欧美一级精品久久| 日韩影院免费视频| 欧美在线观看一区| 亚洲精品免费电影| 色吊一区二区三区| 亚洲欧美激情在线| 色哟哟精品一区| 亚洲欧美日本在线| 色网站国产精品| 亚洲欧美日韩一区| 在线这里只有精品| 亚洲精品欧美在线| 欧美亚洲免费在线一区| 亚洲一区二区高清| 欧美日韩三级一区| 爽好久久久欧美精品| 日韩一区二区高清| 久久99精品久久久久久国产越南| 日韩三区在线观看| 久久99国产乱子伦精品免费| 欧美精品一区二区三| 国产成人免费视频| 国产精品美女一区二区在线观看| 成人美女视频在线看| 中文字幕一区日韩精品欧美| 色又黄又爽网站www久久| 亚洲自拍偷拍综合| 欧美精品777| 黄页视频在线91| 国产精品三级视频| 日本精品裸体写真集在线观看| 亚洲成av人片在线观看| 欧美精品tushy高清| 极品瑜伽女神91| 国产精品麻豆网站| 91国产免费看| 青青草精品视频| 久久噜噜亚洲综合| 91影院在线免费观看| 亚洲成年人影院| 久久久99精品久久| 色妹子一区二区| 蜜臀久久久久久久|