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

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

?? pl0parser.cpp

?? 一、 pl0文法:適用于遞歸下降分析算法
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Pl0Parser.cpp: implementation of the CPl0Parser class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "pl0.h"
#include "Pl0Parser.h"
#include "InputData.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPl0Parser::CPl0Parser()
{

}

CPl0Parser::~CPl0Parser()
{

}

static SymbolTable keys[]={
	"const",MCONST,0,0,-2,0,
	"var",VAR,0,0,-2,0,
	"procedure",PROCEDURE,0,0,-2,0,
	"call",CALL,0,0,-2,0,
	"begin",BEGIN,0,0,-2,0,
	"end",END,0,0,-2,0,
	"if",IF,0,0,-2,0,
	"then",THEN,0,0,-2,0,
	"while",WHILE,0,0,-2,0,
	"do",DO,0,0,-2,0,
	"read",READ,0,0,-2,0,
	"write",WRITE,0,0,-2,0,
	0,0,0,0,-2,0
};

void CPl0Parser::pl0(const char *p)
//編譯器主程序,p指向待編譯的源程序,以'\0'結束
{
	//編譯器初始化
	pCurPosition=p;			//置讀位置
	pStrBuf=stringBuf;		//取單詞緩沖區
	for(int ix=0;ix<STRBUFLEN;ix++) stringBuf[ix]=0;	//清字符串緩沖區
	lineNo=1;				//源程序行號
	curLev=-1;				//置當前層數
	curParent=-1;			//置當前外層
	errOp=ERR_NUN;			//錯誤標志
	errStr="";				//錯誤信息

	for(int i=0;keys[i].pName;i++)	//填寫關鍵字于符號表中
		table[i]=keys[i];
	table[i]=keys[i];

	code.intit(this);				//初始化輸出的目標代碼表	
	code.gen("j",0,0);				//生成第一條轉移指令

	//編譯開始
	NextToken();					//預取一個單詞,詞法分析子程序
	program();						//分析“分程序”
	match(DOT);						//匹配符號"."

	code.modify(0,stCode);			//修改第一條指令轉移到程序的第一條語句
	if(!errStr.IsEmpty())
		MessageBox(0,errStr,"錯誤信息",0);
}

void CPl0Parser::NextToken()
//詞法分析
{
	char ch=Getch();		//取一個有效字符
	if(isalpha(ch))
		getID();			//標識符處理
	else if(isdigit(ch))
		getNum();			//整型常數處理
	else
		switch(ch)			//識別分隔符、運算符等
		{
		case ',':
			tokKind=COMMA;
			return;
		case ';':
			tokKind=SEMICOLON;
			return;
		case '=':
			tokKind=EQ;
			return;
		case '(':
			tokKind=LPAREN;
			return;
		case ')':
			tokKind=RPAREN;
			return;
		case ':':
			ch=Getch();
			if(ch!='=')
			{
				errOp=ERR_UNGETC;
				error("賦值語句缺少“=”!");
			}
			tokKind=ASSIGNOP;
			return;
		case '<':
			ch=Getch();
			if(ch=='=')
				tokKind=LE;
			else
			{
				tokKind=LT;
				unGetch();
			}
			return;
		case '>':
			ch=Getch();
			if(ch=='=')
				tokKind=GE;
			else
			{
				unGetch();
				tokKind=GT;
			}
			return;
		case '#':
			tokKind=NE;
			return;
		case '+':
			tokKind=PLUSOP;
			return;
		case '-':
			tokKind=MINUSOP;
			return;
		case '*':
			tokKind=MULTOP;
			return;
		case '/':
			tokKind=DIVOP;
			return;
		case '.':
			tokKind=DOT;
			return;
		}
}

char CPl0Parser::Getch()
{
	while(1)
	{
		switch(*pCurPosition)
		{
		case '\n':
			lineNo++;
		case '\r':
		case ' ':
		case '\t':
			pCurPosition++;
			continue;
		case '\0':
			return ENDF;
		default:
			return *pCurPosition++;
		}
	}
	return ' ';
}

void CPl0Parser::unGetch()
{
	pCurPosition--;
}

void CPl0Parser::match(int kind)
//匹配指定類型的單詞,然后取下一個單詞
{
	if(kind!=tokKind)
	{
		errOp=ERR_NE;
		error(kind);
	}
	else
		NextToken();
}

void CPl0Parser::getID()
{
	//讀取一個單詞于單詞緩沖區中
	pCurPosition--;
	char *p=pStrBuf;
	while(isalnum(*pCurPosition))
	{
		*p++=*pCurPosition++;
	}
	*p='\0';
	//查填空填符號表
	tokVal=lookUp(pStrBuf);
	//置單詞的類型
	tokKind=table[tokVal].kind;
}

void CPl0Parser::getNum()
//取常數
{
	pCurPosition--;
	tokVal=0;
	while(isdigit(*pCurPosition))
	{
		tokVal=10*tokVal+*pCurPosition++-'0';
	}
	tokKind=NUMBER;
}

int CPl0Parser::lookUp(const char *p)
//如果符號不在符號表中,將符號插入到符號表中,返回單詞在符號表中的位置
{
	int *parents=new int[curLev+2];
	int *pos=new int[curLev+2];
	int lev=curLev+1,par=curParent;

	//構造直接外層鏈,最外層之外層為保留字
	for(;lev>0;lev--,par=table[par].parent)
	{
		parents[lev]=par;
		pos[lev]=-1;
	}
	parents[0]=-2;pos[0]=-1;

	//查找出現在外層鏈中的相同符號,返回最近外層位置
	int i,b=-1;
	for(i=0;table[i].pName!=0;i++)
	{
		if(strcmp(table[i].pName,p)==0)
		{
			b=i;							//符號已出現
			if(table[i].parent==-2) 
				pos[0]=i;					//保留字
			lev=table[i].level+1;			//查找到的符號所在層數
			if(parents[lev]==table[i].parent)
				pos[lev]=i;					//查找符號在某個外層中定義
		}
	}

	//確定符號在符號堆中的位置
	if(b>=0)
		token=table[b].pName;
	else
	{
		pStrBuf+=strlen(p)+1;
		token=p;
	}

	for(b=curLev+1;b>=0;b--)
	{
		if(pos[b]>=0) 
		{
			b=pos[b];
			delete parents;
			delete pos;
			return b;
		}
	}

	table[i].kind=IDENT;
	table[i].level=curLev;
	table[i].pName=token;
	table[i].parent=curParent;
	table[i+1].pName=0;

	delete parents;
	delete pos;

	return i;
}

void CPl0Parser::error(const char *errMsg)
{
	static int n=1;
	switch(errOp)
	{
	case ERR_UNGETC:
		unGetch();
		break;
	}
	char buf[512];
	sprintf(buf,"第%d行錯誤:%s\n",lineNo,errMsg);
	errStr+=buf;
}

void CPl0Parser::error(int kind)
{
	CString s;
	switch(kind)
	{
	case SERVERKEY:
		error("不應該出現保留字!");
		break;
	case CONSTANT:
		error("常量定義錯誤!");
		while(tokKind!=SEMICOLON)
			NextToken();
		break;
	case VARIABLE:
		error("變量定義錯誤!");
		while(tokKind!=SEMICOLON)
			NextToken();
		break;
	case PROCEDURE:
		error("非法過程名或變量重定義!");
		break;
	case FACTOR:
		if(tokKind==IDENT)
		{
			s="變量";
			s=s+token+"未定義錯誤!";
			error(s);
		}
		else
			error("需要常量、變量或(!");
		break;
	case ROP:


	case RPAREN:
		error("括號不匹配,缺少“)”!");
		break;
	case DOT:
		error("程序非法結束!");
		break;
	case THEN:
		error("IF語句缺少THEN!");
		break;
	case DO:
		error("WHILE語句缺少DO!");
		break;
	case END:
		error("缺少END!");
		break;
	case SEMICOLON:
		error("缺少“;”!");
		break;
	}
}

void CPl0Parser::program()
{
	curLev++;
	addr=3;
	constPart();
	varPart();
	int taddr=addr;
	procedure();
	stCode=code.getCodeAddr();
	if(curParent>=0)
	{
		int t,pos=table[curParent].val;
		while(pos>=0)
		{
			t=pos;
			pos=code.codes[t].addr;
			code.codes[t].addr=stCode;
		}
		table[curParent].val=stCode;
		table[curParent].size=taddr;
	}
	int n=code.gen("int",0,taddr);
	word();
	code.gen("opr",0,0);
	curLev--;
}

void CPl0Parser::word()
{
	switch(tokKind)
	{
	case VARIABLE:
		assignWord();
		break;
	case CALL:
		callWord();
		break;
	case BEGIN:
		beginWord();
		break;
	case IF:
		ifWord();
		break;
	case WHILE:
		whileWord();
		break;
	case READ:
		readWord();
		break;
	case WRITE:
		writeWord();
		break;
	}
}

void CPl0Parser::constPart()
{
	bookMark();
	match(tokKind);
	match(tokKind);
	if(tokKind!=EQ)
	{
		retMark();
		return;
	}
	retMark();
	int n;
	if(tokKind!=MCONST)
	{
		error("常量說明,需要以const開始!");
		match(tokKind);
	}
	else
		match(MCONST);
	while(1){
		if(tokKind==IDENT)
		{
			tokKind=table[n=tokVal].kind=CONSTANT;
		}
		else
		{
			if(table[tokVal].parent==-2)
				error("保留字不能是常量名!");
			else
				if(getParent())
					error("非法標識符或標識符已定義!");
				else
					n=fillTable(CONSTANT);
			tokKind=CONSTANT;
		}
		match(CONSTANT);
		match(EQ);
		table[n].val=tokVal;
		match(NUMBER);

		if(tokKind!=COMMA)
			break;
		match(COMMA);
	}
	match(SEMICOLON);
}

void CPl0Parser::varPart()
{
	switch(tokKind)
	{
	case VAR:
		break;
	case PROCEDURE:
	case BEGIN:
		return;
	default:
		bookMark();
		match(tokKind);
		match(tokKind);
		if(tokKind==COMMA)
		{
			retMark();
			break;
		}
		else
		{
			retMark();
			return;
		}
	}
	int n;
	if(tokKind!=VAR)
	{
		error("變量定義應該以var開始!");
		tokKind=VAR;
	}
	match(VAR);
	while(1){
		if(tokKind==IDENT)
		{
			tokKind=table[n=tokVal].kind=VARIABLE;
		}
		else
		{
			if(table[tokVal].parent==-2)
				error("保留字不能是變量名!");
			else
				if(getParent())
					error("非法標識符或標識符已定義!");
				else
					n=fillTable(VARIABLE);
			tokKind=VARIABLE;
		}
		match(VARIABLE);
		table[n].val=addr++;
		if(tokKind!=COMMA)
			break;
		match(COMMA);
	}
	match(SEMICOLON);
}

void CPl0Parser::procedure()
{
	while(1)
	//while(tokKind==PROCEDURE)
	{
		bookMark();
		match(tokKind);
		match(tokKind);
		if(tokKind!=SEMICOLON)
		{
			retMark();
			return;
		}
		retMark();
		int n;
		if(tokKind!=PROCEDURE)
		{
			error("過程定義應該以procedure開始!");
			tokKind=PROCEDURE;
		}
		match(PROCEDURE);
		if(tokKind==IDENT)
		{
			tokKind=table[n=tokVal].kind=PROCEDURE;
		}
		else
		{
			if(table[n=tokVal].parent==-2)
				error(SERVERKEY);
			else
				if(getParent())
					error(PROCEDURE);
				else
					n=fillTable(PROCEDURE);
			tokKind=PROCEDURE;
		}
		match(PROCEDURE);
		match(SEMICOLON);
		table[n].size=-1;
		table[n].val=-1;
		curParent=n;
		program();
		match(SEMICOLON);
		curParent=table[curParent].parent;
	}
}

int CPl0Parser::getParent()
{
	for(int i=0;table[i].pName;i++)
		if(strcmp(table[i].pName,token)==0 && curParent==table[i].parent)
			return 1;
	return 0;
}

int CPl0Parser::fillTable(int kind)
{
	for(int i=0;table[i].pName;i++);
	table[i].pName=token;
	tokKind=table[i].kind=kind;
	table[i].level=curLev;
	table[i].parent=curParent;
	table[i+1].pName=0;
	return i;
}

void CPl0Parser::assignWord()
{
	int n=tokVal;
	int err=0;
	match(VARIABLE);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
最新日韩av在线| 色综合久久中文综合久久牛| 99久久伊人网影院| 欧美一区二区三区白人| 亚洲婷婷综合色高清在线| 无码av免费一区二区三区试看| 国产传媒久久文化传媒| 欧美日韩激情一区| 亚洲欧美色一区| 国产精品亚洲午夜一区二区三区 | 日韩一区二区在线观看视频| 中文字幕成人av| 色综合激情久久| 国产丝袜在线精品| 老司机精品视频线观看86| 91福利在线免费观看| 国产精品国产馆在线真实露脸 | 不卡视频在线观看| 久久一夜天堂av一区二区三区| 丝袜美腿亚洲一区| 色婷婷av久久久久久久| 最新中文字幕一区二区三区| 国产91精品露脸国语对白| 中文字幕一区三区| 国产精品77777| 久久久综合网站| 久久99精品一区二区三区| 91精品国产色综合久久不卡蜜臀| 亚洲福利视频三区| 欧美性猛交一区二区三区精品| ...中文天堂在线一区| 成人动漫精品一区二区| 国产精品乱码一区二三区小蝌蚪| 国产专区综合网| 国产婷婷色一区二区三区四区 | 日韩激情一区二区| 欧美日韩一区二区在线观看视频 | 国产精品入口麻豆九色| 国产成a人亚洲| 中文无字幕一区二区三区| 国产精品一品二品| 欧美国产日韩在线观看| 成人黄色一级视频| 亚洲色图.com| 欧美性videosxxxxx| 午夜久久久影院| 日韩三级.com| 国产成人综合亚洲网站| 日韩影视精彩在线| 欧美一级片在线| 狠狠网亚洲精品| 国产精品视频免费| 在线视频一区二区免费| 偷拍自拍另类欧美| 亚洲精品在线观| 99久久婷婷国产综合精品电影| 一区二区三区在线免费观看 | 蜜臀av一区二区在线观看| 日韩手机在线导航| 国产成人鲁色资源国产91色综| 亚洲天堂a在线| 国产精品久久久久久久岛一牛影视| 97久久超碰国产精品电影| 亚洲国产aⅴ成人精品无吗| 91麻豆精品国产无毒不卡在线观看| 久久99精品国产.久久久久久| 欧美极品少妇xxxxⅹ高跟鞋| 在线一区二区视频| 国产一区二区不卡老阿姨| 亚洲欧洲在线观看av| 6080日韩午夜伦伦午夜伦| 国产成人精品影院| 午夜亚洲国产au精品一区二区 | 欧美一区二区三区视频| 国产91精品一区二区| 国产乱理伦片在线观看夜一区| 日韩美女精品在线| 日韩欧美国产一区二区三区| 97精品国产露脸对白| 久久99久久99| 亚洲第一在线综合网站| 国产精品免费久久| 欧美一区二区三区的| 91免费版在线| 国内精品自线一区二区三区视频| 一区二区三区在线视频播放| 久久久久久久久岛国免费| 欧美精品xxxxbbbb| 色综合久久天天| 国产成人精品免费在线| 男人的天堂亚洲一区| 久久99精品国产麻豆不卡| 日韩av在线播放中文字幕| 亚洲三级电影全部在线观看高清| 精品国产一区二区精华| 欧美日本乱大交xxxxx| www.亚洲精品| 丁香六月久久综合狠狠色| 精品影院一区二区久久久| 亚洲小说欧美激情另类| 亚洲视频在线观看三级| 国产精品三级在线观看| 欧美精品一区二区在线观看| 制服视频三区第一页精品| 91福利区一区二区三区| 色婷婷久久久久swag精品 | 99久久婷婷国产| 成人激情免费视频| 成人av网站免费观看| 国产传媒日韩欧美成人| 国产成人午夜精品影院观看视频 | 亚洲天堂久久久久久久| 国产精品久久久久久久第一福利| 国产欧美精品一区二区色综合| 久久综合视频网| 亚洲精品在线免费播放| 久久久久国产精品麻豆| 国产丝袜在线精品| 亚洲高清视频的网址| 亚洲电影激情视频网站| 亚洲一区二区三区四区的| 亚洲综合激情小说| 亚洲成人1区2区| 日本欧美一区二区| 美女视频网站黄色亚洲| 精品一区二区精品| 国产99精品国产| 99精品国产91久久久久久| 91久久精品日日躁夜夜躁欧美| 色综合天天视频在线观看| 欧美性做爰猛烈叫床潮| 欧美一级精品在线| 国产性做久久久久久| 国产精品久久久久aaaa| 久久精品国产99久久6| 久久成人免费日本黄色| 国产99久久久精品| 色婷婷一区二区| 日韩一级完整毛片| 国产亚洲一区二区三区在线观看| 国产精品成人在线观看 | 国产精品美女久久久久久| 亚洲乱码一区二区三区在线观看| 亚洲国产精品久久久久婷婷884| 日日摸夜夜添夜夜添国产精品 | 国产精品久久久久久久久免费相片| 国产精品免费av| 国产成人在线视频网址| 91麻豆国产精品久久| 欧美一级国产精品| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 老司机午夜精品| 91丝袜美女网| 欧美一区二区视频在线观看| 在线精品亚洲一区二区不卡| 亚洲成人1区2区| 久久99精品国产.久久久久久| 午夜精品免费在线| 欧美性xxxxxxxx| 2014亚洲片线观看视频免费| 亚洲视频一区在线| 国产在线精品免费| 色悠悠久久综合| 欧美一级一级性生活免费录像| 精品av综合导航| 亚洲婷婷国产精品电影人久久| 日韩成人av影视| 丰满白嫩尤物一区二区| 欧美主播一区二区三区美女| 精品国产91九色蝌蚪| 91精品国产一区二区三区| 国产精品久久久久永久免费观看| 免费在线观看视频一区| 成人一区在线观看| 制服丝袜亚洲网站| 亚洲黄色尤物视频| 狠狠网亚洲精品| 亚洲精品一区二区三区福利| 亚洲同性gay激情无套| 国产91精品一区二区麻豆亚洲| 欧美精品一二三区| 中文字幕在线免费不卡| 国产精品一区久久久久| 欧洲av一区二区嗯嗯嗯啊| 国产欧美日韩在线| 国产农村妇女精品| 国产精品一区一区三区| 337p亚洲精品色噜噜| 亚洲欧洲av一区二区三区久久| 国产不卡在线一区| 精品国产sm最大网站| 香蕉久久夜色精品国产使用方法 | 免费观看在线色综合| 欧美日韩亚州综合| 亚洲视频一二三| 国产高清精品网站| 成人综合在线观看| 中文字幕国产一区| 国产精品自拍网站| 日韩一区二区不卡|