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

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

?? fc-compile.cpp

?? 編譯原理的一個課程設計
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#include <math.h>

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

CFCDlg::ZIdentType CFCDlg::GetIdentType(char ident[IDENTLENGTH])
{
	int i;
	for(i=0;i<=m_iFunction;i++)//查找函數名字列表
		if(strcmp(ident,m_function[i].name)==0)
			return IT_FUNCTION;
	if(m_iFunction>=0 && m_iFunction<=m_iFunction)
	{
		for(i=m_function[m_iFunction].iIdent-1;i>=0;i--)//查找變量列表
			if(strcmp(ident,m_function[m_iFunction].ident[i].name)==0)//標識符名相同
			{
				if(m_function[m_iFunction].ident[i].level==m_function[m_iFunction].level)
					return m_function[m_iFunction].ident[i].type;//當前作用域的變量或數組
				else if(m_function[m_iFunction].ident[i].level>=0)
				{
					switch(m_function[m_iFunction].ident[i].type)
					{
					case IT_INT:return IT_INTINRANG;
					case IT_DOUBLE:return IT_DOUBLEINRANG;
					case IT_INTARRAY:return IT_IARRAYINRANG;
					case IT_DOUBLEARRAY:return IT_DARRAYINRANG;
					}
				}
			}
		for(i=0;i<m_function[m_iFunction].iParam;i++)//查找參數列表
			if(strcmp(ident,m_function[m_iFunction].param[i].name)==0)
				return m_function[m_iFunction].param[i].type;
	}
	return IT_NULL;
}

BOOL CFCDlg::ErrorReport(CFCErrorDlg::ZErrorType et)
{
	m_iErrorCount++;
	int i,i0,cnt=0;
	for(i=0;cnt<m_iLine;i++)
		if(m_source[i]=='\n')
			cnt++;
	i0=i;
	for(i0=i;i<m_SourceLength;i++)
		if(m_source[i]=='\r')
			break;
	CFCErrorDlg dlg;
	MessageBeep(0);
	if(dlg.ErrorReport(m_iLine+1,m_source.Mid(i0,i-i0),et)==IDCANCEL)
	{
		if(m_iStatus==2)On_ExitCompile();
		else if(m_iStatus==4)On_ExitTranslate();
		return FALSE;
	}
	return TRUE;
}

BOOL CFCDlg::SearchMain(void)
{
	int i,cnt,n;
	for(i=0;i<m_iFunction;i++)
		if(strcmp("main",m_function[i].name)==0)
			break;
	if(i==m_iFunction)
	{
		if(!ErrorReport(CFCErrorDlg::ET_NOMAIN))
			return FALSE;
	}
	else if(m_function[i].iParam!=0)
	{
		if(!ErrorReport(CFCErrorDlg::ET_PARAMMAIN))
			return FALSE;
	}
	else if(m_function[i].ReturnType!=IT_VOID)
	{
		if(!ErrorReport(CFCErrorDlg::ET_NOVOIDMAIN))
			return FALSE;
	}
	n=2*i+1;
	cnt=0;
	for(i=1;cnt<n && i<nCODE;i++)
		if(m_code[i].op==OP_NULL)
			cnt++;
	m_code[0].op=OP_CALL;
	m_code[0].sd.iNumber=i-1;
	return TRUE;
}

BOOL CFCDlg::TestCode(void)
{
	if(m_iCode>=nCODE)
		return ErrorReport(CFCErrorDlg::ET_LONGPROGRAM);
	return TRUE;
}

BOOL CFCDlg::GetElement(void)//詞法分析函數
{
	while(1)//跳過空格,tab,回車符,注釋
	{
		if(m_iCount>=m_SourceLength)//到達源代碼尾
		{
			m_curElement=E_FILEEND;
			return TRUE;
		}
		if(m_source[m_iCount]==' ' || m_source[m_iCount]=='\t' || //空白字符
			m_source[m_iCount]=='\r' || m_source[m_iCount]=='\n')	//換行字符
		{
			if(m_source[m_iCount]=='\n')
				m_iLine++;
			m_iCount++;
		}
		else if(m_source[m_iCount]=='/' && m_iCount+1<m_SourceLength) //可能為注釋
		{
			if(m_source[m_iCount+1]=='/')//單行注釋
			{
				for(m_iCount+=2;m_iCount<m_SourceLength && m_source[m_iCount]!='\n';m_iCount++);
				if(m_iCount!=m_SourceLength)
				{
					m_iCount++;
					m_iLine++;
				}
			}
			else if(m_source[m_iCount+1]=='*')//多行注釋
			{
				m_iCount+=2;
				while(1)
				{
					if(m_iCount>=m_SourceLength)
					{
						m_curElement=E_FILEEND;
						return TRUE;
					}
					if(m_source[m_iCount]=='\r')
						m_iLine++;
					else if(m_source[m_iCount]=='*' && m_iCount+1<m_SourceLength &&
						m_source[m_iCount+1]=='/')
					{
						m_iCount+=2;
						break;
					}
					m_iCount++;
				}
			}
			else break;
		}
		else break;
	}
	switch(m_source[m_iCount])//此處處理運算符
	{
		case '+':
			m_iCount++;
			m_curElement=E_PLUS;
			return TRUE;
		case '-':
			m_iCount++;
			m_curElement=E_MINUS;
			return TRUE;
		case '*':
			m_iCount++;
			m_curElement=E_TIMES;
			return TRUE;
		case '/':
			m_iCount++;
			m_curElement=E_SLASH;
			return TRUE;
		case '%':
			m_iCount++;
			m_curElement=E_MOD;
			return TRUE;
		case '(':
			m_iCount++;
			m_curElement=E_LPAREN;
			return TRUE;
		case ')':
			m_iCount++;
			m_curElement=E_RPAREN;
			return TRUE;
		case '[':
			m_iCount++;
			m_curElement=E_LSUB;
			return TRUE;
		case ']':
			m_iCount++;
			m_curElement=E_RSUB;
			return TRUE;
		case '{':
			m_iCount++;
			m_curElement=E_BEGIN;
			return TRUE;
		case '}':
			m_iCount++;
			m_curElement=E_END;
			return TRUE;
		case ',':
			m_iCount++;
			m_curElement=E_COMMA;
			return TRUE;
		case ':':
			m_iCount++;
			m_curElement=E_COLON;
			return TRUE;
		case ';':
			m_iCount++;
			m_curElement=E_SEMICOLON;
			return TRUE;
		case '!':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
			{
				m_iCount+=2;
				m_curElement=E_NOTEQUAL;
			}
			else
			{
				m_iCount++;
				m_curElement=E_NOT;
			}
			return TRUE;
		case '>':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
			{
				m_iCount+=2;
				m_curElement=E_GREATEQUAL;
			}
			else
			{
				m_iCount++;
				m_curElement=E_GREAT;
			}
			return TRUE;
		case '<':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
			{
				m_iCount+=2;
				m_curElement=E_LESSEQUAL;
			}
			else
			{
				m_iCount++;
				m_curElement=E_LESS;
			}
			return TRUE;
		case '=':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
			{
				m_iCount+=2;
				m_curElement=E_EQUAL;
			}
			else
			{
				m_iCount++;
				m_curElement=E_BECOMES;
			}
			return TRUE;
		case '&':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='&')
			{
				m_iCount+=2;
				m_curElement=E_AND;
				return TRUE;
			}
			else
			{
				ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
				return FALSE;
			}
		case '|':
			if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='|')
			{
				m_iCount+=2;
				m_curElement=E_OR;
				return TRUE;
			}
			else
			{
				ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
				return FALSE;
			}
	}//end switch
	if(m_source[m_iCount]>='0' && m_source[m_iCount]<='9')//此處處理數
	{
		int d=0,l=0,n=0;
		do
		{
			n*=10;
			n+=m_source[m_iCount]-'0';
			m_iCount++;
		}
		while(m_iCount<m_SourceLength &&
			m_source[m_iCount]>='0' && m_source[m_iCount]<='9');
		if(m_iCount<m_SourceLength && m_source[m_iCount]=='.')//有小數點
		{
			m_iCount++;
			if(m_iCount<m_SourceLength &&
				m_source[m_iCount]>='0' && m_source[m_iCount]<='9')
			{	//實數
				m_dCurNumber=n;
				do
				{
					l++;
					m_dCurNumber+=(m_source[m_iCount]-'0')/pow(10,l);
					m_iCount++;
				}
				while(m_iCount<m_SourceLength &&
					m_source[m_iCount]>='0' && m_source[m_iCount]<='9');
				m_curElement=E_DNUMBER;
				return TRUE;
			}
		}
		//無小數點或小數點后沒有數字 -- 整數
		m_curElement=E_INUMBER;
		m_nCurNumber=n;
		return TRUE;
	}
	if((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||//標識符或者關鍵字
		(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') || 
		m_source[m_iCount]=='_' )
	{
		char str[IDENTLENGTH];
		int i=0;
		while(m_iCount<m_SourceLength &&	//此循環獲取連續的字母數字下劃線串
			((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||
			(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') ||
			(m_source[m_iCount]>='0' && m_source[m_iCount]<='9') ||
			m_source[m_iCount]=='_' ) )
		{
			if(i==IDENTLENGTH-1)//標識符過長
			{
				if(ErrorReport(CFCErrorDlg::ET_LONGIDENT))
				{//返回TRUE,繼續編譯,跳過過長的標識符
					while(m_iCount<m_SourceLength &&
						((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||
						(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') ||
						(m_source[m_iCount]>='0' && m_source[m_iCount]<='9')))
							m_iCount++;
					m_curElement=E_IDENT;
					str[IDENTLENGTH-1]='\0';
					strcpy(m_curIdent,str);
					return TRUE;
				}
				else return FALSE;
			}
			str[i]=m_source[m_iCount];
			i++;
			m_iCount++;
		}//while end
		str[i]='\0';
		strlwr(str);
		switch(str[0])//根據首字母判斷關鍵字
		{
		case 'b':
			if(strcmp("break",str)==0)
			{
				m_curElement=E_BREAK;
				return TRUE;
			}
			break;
		case 'c':
			if(strcmp("case",str)==0)
			{
				m_curElement=E_CASE;
				return TRUE;
			}
			if(strcmp("continue",str)==0)
			{
				m_curElement=E_CONTINUE;
				return TRUE;
			}
			break;
		case 'd':
			if(strcmp("default",str)==0)
			{
				m_curElement=E_DEFAULT;
				return TRUE;
			}
			if(strcmp("double",str)==0)
			{
				m_curElement=E_DOUBLE;
				return TRUE;
			}
			if(strcmp("do",str)==0)
			{
				m_curElement=E_DO;
				return TRUE;
			}
			break;
		case 'e':
			if(strcmp("else",str)==0)
			{
				m_curElement=E_ELSE;
				return TRUE;
			}
			if(strcmp("exit",str)==0)
			{
				m_curElement=E_EXIT;
				return TRUE;
			}
			break;
		case 'i':
			if(strcmp("if",str)==0)
			{
				m_curElement=E_IF;
				return TRUE;
			}
			if(strcmp("int",str)==0)
			{
				m_curElement=E_INT;
				return TRUE;
			}
			if(strcmp("input",str)==0)
			{
				m_curElement=E_INPUT;
				return TRUE;
			}
			break;
		case 'o':
			if(strcmp("output",str)==0)
			{
				m_curElement=E_OUTPUT;
				return TRUE;
			}
			break;
		case 'r':
			if(strcmp("return",str)==0)
			{
				m_curElement=E_RETURN;
				return TRUE;
			}
			break;
		case 's':
			if(strcmp("switch",str)==0)
			{
				m_curElement=E_SWITCH;
				return TRUE;
			}
		case 'v':
			if(strcmp("void",str)==0)
			{
				m_curElement=E_VOID;
				return TRUE;
			}
			break;
		case 'w':
			if(strcmp("while",str)==0)
			{
				m_curElement=E_WHILE;
				return TRUE;
			}
			break;
		}//switch end
		strcpy(m_curIdent,str);
		m_curElement=E_IDENT;
		return TRUE;
	}
	if(m_source[m_iCount]=='\"')//此處處理字符串
	{
		CString str="";
		BOOL bSys=FALSE;//轉義字符標記
		for(m_iCount++;m_iCount<m_SourceLength;m_iCount++)
		{
			if(!bSys && m_source[m_iCount]=='\\')//轉義字符
				bSys=TRUE;
			else if(bSys)
			{
				switch(m_source[m_iCount])
				{
				case 'n'://回車符
					str+="\r\n";
					break;
				case 't':
					str+='\t';
					break;
				case '\"'://引號
					str+='\"';
					break;
				case '\\':
					str+='\\';
					break;
				case '\r'://多行字符串
					m_iCount++;
					m_iLine++;
					break;
				default:
					str+='\\';
					str+=m_source[m_iCount];
					break;
				}
				bSys=FALSE;
			}
			else if(m_source[m_iCount]=='\"')//字符串結束
			{
				m_iCount++;
				m_curElement=E_STRING;
				m_curString=str;
				return TRUE;
			}
			else if(m_source[m_iCount]=='\r')//換行,字符串意外結束
			{
				if(ErrorReport(CFCErrorDlg::ET_STRINGNOEND))
				{	//返回TRUE,繼續編譯,
					m_curElement=E_STRING;
					m_curString=str;
					return TRUE;
				}
				else return FALSE;
			}
			else str+=m_source[m_iCount];
		}//end for
		//若能運行到此處,必有m_iCount==m_SourceLength,即到達源代碼尾而字符串沒結束
		if(ErrorReport(CFCErrorDlg::ET_STRINGNOEND))
		{	//返回TRUE,繼續編譯,
			m_curElement=E_STRING;
			m_curString=str;
			return TRUE;
		}
		else return FALSE;
	}
	//若能運行到此處,即碰到無法認識的字符
	ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
	return FALSE;
}

int CFCDlg::SearchFunction(int n)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡的av网站| 欧美电影免费观看完整版| 欧美日高清视频| 欧美国产丝袜视频| 人人精品人人爱| 日本道精品一区二区三区| 国产偷国产偷亚洲高清人白洁| 亚洲va韩国va欧美va精品| 成人黄页毛片网站| 久久综合五月天婷婷伊人| 偷窥国产亚洲免费视频| 欧美曰成人黄网| 综合欧美亚洲日本| 成人av在线电影| 国产亚洲精品bt天堂精选| 蜜臀精品久久久久久蜜臀| 欧美日韩精品系列| 亚洲一区二区三区国产| 成人av网在线| 中文字幕乱码日本亚洲一区二区 | 精品国精品国产| 日韩va欧美va亚洲va久久| 色婷婷av一区二区三区软件 | 中文成人av在线| 久久国产精品99久久久久久老狼| 欧美性高清videossexo| 一区二区三区在线观看国产| 91原创在线视频| 亚洲欧美一区二区在线观看| 成人性生交大片| 成人免费一区二区三区在线观看| 成人av免费在线播放| 欧美国产在线观看| 91在线播放网址| 一区av在线播放| 欧美日韩国产高清一区二区三区 | 国产精品国产馆在线真实露脸 | 国产精品久久久久影院亚瑟| 大桥未久av一区二区三区中文| 国产视频视频一区| 成人高清在线视频| 亚洲欧美二区三区| 欧美日韩在线观看一区二区| 日日夜夜精品视频免费| 日韩一区二区三免费高清| 久久99精品国产麻豆不卡| 久久综合九色综合欧美98| 国产麻豆精品在线观看| 日韩毛片精品高清免费| 色综合久久久久综合| 丝袜国产日韩另类美女| 欧美精品一区二区三区蜜桃| 国产成人在线观看| 一区二区三区四区精品在线视频| 欧美日韩一区二区三区不卡| 男女激情视频一区| 国产目拍亚洲精品99久久精品| 一本色道亚洲精品aⅴ| 日本视频一区二区三区| 久久久久久99久久久精品网站| 99久久er热在这里只有精品15 | 国产激情视频一区二区在线观看 | 亚洲欧美偷拍三级| 56国语精品自产拍在线观看| 国产麻豆精品久久一二三| 中文字幕中文在线不卡住| 欧美日韩国产另类一区| 国产精品一二一区| 一区二区三区丝袜| 久久综合色之久久综合| 91在线观看一区二区| 久久成人久久鬼色| 亚洲免费视频中文字幕| 日韩免费观看2025年上映的电影| 成人丝袜高跟foot| 日韩在线卡一卡二| 亚洲欧洲一区二区在线播放| 日韩欧美中文字幕公布| 91老师国产黑色丝袜在线| 国产一区二区伦理片| 午夜久久久久久久久| 国产精品免费丝袜| 欧美成人精精品一区二区频| 91成人在线观看喷潮| 国产精品91一区二区| 日韩电影在线一区二区三区| 亚洲视频每日更新| 国产免费成人在线视频| www久久精品| 7777精品伊人久久久大香线蕉最新版| 99精品欧美一区| 国产成人在线色| 国产一区二区三区在线观看精品 | 国产农村妇女精品| 日韩免费观看高清完整版在线观看| 91精品1区2区| 91香蕉视频黄| eeuss影院一区二区三区| 久久国产三级精品| 日韩激情视频在线观看| 亚洲国产日韩综合久久精品| 亚洲精品免费一二三区| 国产精品久久毛片| 国产欧美精品一区| 欧美高清一级片在线观看| 久久午夜电影网| 久久日韩精品一区二区五区| 欧美大片一区二区| 日韩视频免费观看高清完整版在线观看 | 国产一区二区三区免费看| 日韩精品亚洲一区二区三区免费| 亚洲第一主播视频| 亚洲综合免费观看高清完整版| 自拍偷在线精品自拍偷无码专区 | 国产亚洲精品福利| 国产视频一区在线观看| 国产欧美精品一区aⅴ影院 | 久久99精品国产.久久久久| 免费成人在线网站| 久久精品国产精品亚洲红杏| 久久精品国产精品青草| 国产呦精品一区二区三区网站| 国精产品一区一区三区mba视频 | 99精品欧美一区二区三区小说| 99久久综合色| 色乱码一区二区三区88| 欧美三级资源在线| 欧美大胆人体bbbb| 欧美国产日韩a欧美在线观看| 国产精品系列在线| 亚洲一区二区三区爽爽爽爽爽| 日韩高清不卡一区二区| 国产综合久久久久久鬼色| 高清成人在线观看| 在线观看日韩高清av| 欧美一区二区三区精品| 久久久久久99精品| 亚洲女与黑人做爰| 日本成人在线一区| 国产精品456露脸| 色婷婷久久久久swag精品| 69精品人人人人| 久久久久久久久岛国免费| 一区二区三区中文在线观看| 蜜桃视频在线观看一区二区| 成人av资源下载| 欧美一级二级三级蜜桃| 欧美国产精品一区| 日韩国产在线一| 丁香婷婷综合五月| 91精品一区二区三区在线观看| 国产色爱av资源综合区| 亚洲午夜三级在线| 国产成人8x视频一区二区 | 久久久精品国产免大香伊| 中文字幕一区二区三区四区| 日韩精品成人一区二区三区| 成人美女在线观看| 日韩欧美在线观看一区二区三区| 国产精品电影一区二区| 秋霞国产午夜精品免费视频| 91网站最新地址| www国产精品av| 午夜精品一区在线观看| 成人av在线资源网站| 欧美成人女星排行榜| 亚洲在线一区二区三区| 国产成人精品一区二| 91精品国产综合久久小美女| 亚洲日本va在线观看| 国产在线视频一区二区三区| 在线播放欧美女士性生活| 亚洲精品国产精华液| 国产成人三级在线观看| 欧美一区二区三区视频免费| 亚洲激情一二三区| 成人av手机在线观看| 国产亚洲欧洲一区高清在线观看| 日韩1区2区3区| 欧美在线免费观看视频| 中文字幕一区二区三区不卡| 国产麻豆欧美日韩一区| 精品国产乱码91久久久久久网站| 亚洲成人动漫在线免费观看| 91免费看`日韩一区二区| 中文字幕不卡在线| 国产福利一区在线观看| 精品国内片67194| 另类小说综合欧美亚洲| 欧美精品久久久久久久久老牛影院 | 欧美午夜电影网| 亚洲区小说区图片区qvod| 91在线免费播放| 亚洲色图色小说| 一本色道久久加勒比精品| 中文字幕永久在线不卡| 91丨porny丨户外露出| 国产精品黄色在线观看| 99re热这里只有精品视频| 综合久久久久综合|