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

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

?? lexdemoview.cpp

?? 包括一個LR(1)的語法分析程序和一個LL(1)的語法分析程序的例子
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// lexDemoView.cpp : implementation of the CLexDemoView class
//

#include "stdafx.h"
#include "lexDemo.h"

#include "lexDemoDoc.h"
#include "lexDemoView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView

IMPLEMENT_DYNCREATE(CLexDemoView, CView)

BEGIN_MESSAGE_MAP(CLexDemoView, CView)
	//{{AFX_MSG_MAP(CLexDemoView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(IDM_LL_ONE, OnLlOne)
	ON_COMMAND(IDM_REVERSE_POLAND, OnReversePoland)
	ON_COMMAND(IDM_LR_ZERO, OnLrZero)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView construction/destruction

CLexDemoView::CLexDemoView()
{
	// TODO: add construction code here
  m_analTable = NULL;
}

CLexDemoView::~CLexDemoView()
{
	if (m_analTable != NULL)
		delete []m_analTable;
}

BOOL CLexDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView drawing

void CLexDemoView::OnDraw(CDC* pDC)
{
	CLexDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView printing

BOOL CLexDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CLexDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CLexDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView diagnostics

#ifdef _DEBUG
void CLexDemoView::AssertValid() const
{
	CView::AssertValid();
}

void CLexDemoView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CLexDemoDoc* CLexDemoView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLexDemoDoc)));
	return (CLexDemoDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView message handlers
//功能描述: 打開指定文件,對文件內容進行分析
void CLexDemoView::OnFileOpen() 
{
	
	
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::LexAnal
//功能描述: 打開指定文件,對文件內容進行分析
Status CLexDemoView::LexAnal()
{
	char chInput;
	char * szTop = NULL;
	char * szOut = NULL;
	CString strTop;
	CString strOut;
  CString strVal;
	LElem nextElem = NULL;
	int i = 0;
	Status sRet = OK;
	InitAnalTable();
	InitAnalStack();
	do
	{
		sRet = GetNextInput(chInput);
		if (END_OF_INPUT == sRet)  //輸入字符已經讀取完畢, 但分析棧仍不為空,出錯
		{
			LexUtil::ErrMsg("error: end of Input while analStack is not empty");	
			break;
		}
		sRet = m_analStack.Top(strTop);
		if (IsTerminals(strTop))  //判斷分析棧棧頂元素是否為終結符
		{
			if (strTop[0] == chInput)   //如果棧頂的終結符與輸入的字符相同的話,則出棧否則報錯
			{
				m_analStack.Pop(strOut);
			}
			else
			{
				LexUtil::ErrMsg("Parse error");
				break;
			}
		}
		else										//分析棧棧頂元素不是終結符的話
		{
			nextElem = FindNextState((LPTSTR)(LPCTSTR)strTop, chInput);
			if (nextElem != NULL)
			{
				strVal.Format("%d:%s---", i++, nextElem->replace);
				if (P == nextElem->nextStep)
				{
					strVal.Insert(strVal.GetLength(), "P");
				}
				else if (N == nextElem->nextStep)
				{
					strVal.Insert(strVal.GetLength(), "N");
				}
				else if (ACC == nextElem->nextStep)
				{
					strVal.Insert(strVal.GetLength(), "ACC");
				}
				m_analStack.Pop(strOut);
				SplitPush(nextElem->replace);
				if (P ==nextElem->nextStep)   //如果下一動作是P的話
				{
					UnGetInput();
				}	
			}
			else
			{
				CString strMsg;
				strMsg.Format("%s: %c", strTop, chInput);
				LexUtil::ErrMsg(strMsg);
				LexUtil::ErrMsg("在分析表中沒有匹配動作序列");
				break;
			}
		}
		m_lstToken.AddString(strVal);
		AddToListForLL(m_analStack);
	} while (!m_analStack.IsEmpty());
	return OK;
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::InitAnalTable
//功能描述: 構造LL(1)語法分析表
//分析表的來源:教材159頁的練習題6.6中的文法所對應的分析表
//這個表與教材134頁的表6-6中的分析表比很相象,只不過增加了
//  對 *, /的支持
Status CLexDemoView::InitAnalTable()
{
	if (NULL != m_analTable)
    return OK;
  
  m_analTable = new Elem[TABLE_LENGTH];
  if (NULL == m_analTable)
		return FAIL;
  
  strcpy(m_analTable[0].notTerminals, "E");
	m_analTable[0].terminal = '(';
	strcpy(m_analTable[0].replace, "E1T");
	m_analTable[0].nextStep = P;

	strcpy(m_analTable[1].notTerminals, "E");
	m_analTable[1].terminal = 'i';
	strcpy(m_analTable[1].replace, "E1T");
	m_analTable[1].nextStep = P;

	strcpy(m_analTable[2].notTerminals, "E1");
	m_analTable[2].terminal = '+';
	strcpy(m_analTable[2].replace, "E1T");
	m_analTable[2].nextStep = N;

	strcpy(m_analTable[3].notTerminals, "E1");
	m_analTable[3].terminal = '-';
	strcpy(m_analTable[3].replace, "E1T");
	m_analTable[3].nextStep = N;
	
	strcpy(m_analTable[4].notTerminals, "E1");
	m_analTable[4].terminal = ')';
	strcpy(m_analTable[4].replace, "e");   //e means empty
	m_analTable[4].nextStep = P;

	strcpy(m_analTable[5].notTerminals, "E1");
	m_analTable[5].terminal = '#';
	strcpy(m_analTable[5].replace, "e");   //e means empty
	m_analTable[5].nextStep = P;

	strcpy(m_analTable[6].notTerminals, "T");
	m_analTable[6].terminal = '(';
	strcpy(m_analTable[6].replace, "T1F"); 
	m_analTable[6].nextStep = P;

	strcpy(m_analTable[7].notTerminals, "T");
	m_analTable[7].terminal = 'i';
	strcpy(m_analTable[7].replace, "T1F"); 
	m_analTable[7].nextStep = P;

	strcpy(m_analTable[8].notTerminals, "T1");
	m_analTable[8].terminal = '+';
	strcpy(m_analTable[8].replace, "e"); 
	m_analTable[8].nextStep = P;

	strcpy(m_analTable[9].notTerminals, "T1");
	m_analTable[9].terminal = '-';
	strcpy(m_analTable[9].replace, "e"); 
	m_analTable[9].nextStep = P;

	strcpy(m_analTable[10].notTerminals, "T1");
	m_analTable[10].terminal = '*';
	strcpy(m_analTable[10].replace, "T1F"); 
	m_analTable[10].nextStep = N;  

	strcpy(m_analTable[11].notTerminals, "T1");
	m_analTable[11].terminal = '/';
	strcpy(m_analTable[11].replace, "T1F"); 
	m_analTable[11].nextStep = N;  

	strcpy(m_analTable[12].notTerminals, "T1");
	m_analTable[12].terminal = ')';
	strcpy(m_analTable[12].replace, "e"); 
	m_analTable[12].nextStep = P;  

	strcpy(m_analTable[13].notTerminals, "T1");
	m_analTable[13].terminal = '#';
	strcpy(m_analTable[13].replace, "e"); 
	m_analTable[13].nextStep = P;  

	strcpy(m_analTable[14].notTerminals, "F");
	m_analTable[14].terminal = '(';
	strcpy(m_analTable[14].replace, "F1P"); 
	m_analTable[14].nextStep = P;  

	strcpy(m_analTable[15].notTerminals, "F");
	m_analTable[15].terminal = 'i';
	strcpy(m_analTable[15].replace, "F1P"); 
	m_analTable[15].nextStep = P;  

	strcpy(m_analTable[16].notTerminals, "F1");
	m_analTable[16].terminal = '+';
	strcpy(m_analTable[16].replace, "e"); 
	m_analTable[16].nextStep = P;  

	strcpy(m_analTable[17].notTerminals, "F1");
	m_analTable[17].terminal = '-';
	strcpy(m_analTable[17].replace, "e"); 
	m_analTable[17].nextStep = P;  

	strcpy(m_analTable[18].notTerminals, "F1");
	m_analTable[18].terminal = '*';
	strcpy(m_analTable[18].replace, "e"); 
	m_analTable[18].nextStep = P;  

	strcpy(m_analTable[19].notTerminals, "F1");
	m_analTable[19].terminal = '/';
	strcpy(m_analTable[19].replace, "e"); 
	m_analTable[19].nextStep = P;  

	strcpy(m_analTable[20].notTerminals, "F1");
	m_analTable[20].terminal = ')';
	strcpy(m_analTable[20].replace, "e"); 
	m_analTable[20].nextStep = P;  

	strcpy(m_analTable[21].notTerminals, "F1");
	m_analTable[21].terminal = '#';
	strcpy(m_analTable[21].replace, "e"); 
	m_analTable[21].nextStep = P;  

	strcpy(m_analTable[22].notTerminals, "P");
	m_analTable[22].terminal = '(';
	strcpy(m_analTable[22].replace, ")E"); 
	m_analTable[22].nextStep = N;  	

	strcpy(m_analTable[23].notTerminals, "P");
	m_analTable[23].terminal = 'i';
	strcpy(m_analTable[23].replace, "e"); 
	m_analTable[23].nextStep = N;  	

	strcpy(m_analTable[24].notTerminals, ")");
	m_analTable[24].terminal = ')';
	strcpy(m_analTable[24].replace, "e"); 
	m_analTable[24].nextStep = N;  	

	strcpy(m_analTable[25].notTerminals, "+");
	m_analTable[25].terminal = '+';
	strcpy(m_analTable[25].replace, "e"); 
	m_analTable[25].nextStep = ACC;  	

	strcpy(m_analTable[25].notTerminals, "#");
	m_analTable[25].terminal = '#';
	strcpy(m_analTable[25].replace, "e"); 
	m_analTable[25].nextStep = ACC;  	

	return OK;
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::InitAnalStack
//功能描述: 構造語法分析棧  
Status CLexDemoView::InitAnalStack()
{
  //m_analStack.InitStack(40);
	m_analStack.Push("#");
	m_analStack.Push("E");
	return OK;
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::GetNextInput()
//功能描述: 獲得下一個輸入流中的字符
Status CLexDemoView::GetNextInput(char& valOut)
{
	if (m_szInput[m_lInputPos] != '\0')
	{
		valOut = m_szInput[m_lInputPos++];
		return OK;
	}
	else
	{
		return END_OF_INPUT;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::UnGetInput
//功能描述: 回退輸入流指針到前一個字符
Status CLexDemoView::UnGetInput()
{
	if (m_lInputPos <= 0)
	{
		return BEGINNING_OF_INPUT;
	}
	else
	{
		m_lInputPos--;
		return OK;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::IsTerminals
//功能描述:判斷參數字符串是否為終結符元素  
bool CLexDemoView::IsTerminals(CString strVal)
{
	if (!strcmp(strVal, "i"))
	{
		return true;
	} 
	if (!strcmp(strVal, "("))
	{
		return true;
	}
	if (!strcmp(strVal, "+"))
	{
		return true;
	}
	if (!strcmp(strVal, "-"))
	{
		return true;
	}
	if (!strcmp(strVal, "*"))
	{
		return true;
	}
	if (!strcmp(strVal, "/"))
	{
		return true;
	}
	if (!strcmp(strVal, ")"))
	{
		return true;
	}
	return false;
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::FindNextState
//功能描述:根據當前棧頂元素和輸入元素查分析表取得下一個狀態動作
LElem CLexDemoView::FindNextState(char * szTop, char chInput)
{
	for (int i = 0; i < TABLE_LENGTH; i++)
	{
		if(!strcmp(m_analTable[i].notTerminals, szTop) && m_analTable[i].terminal == chInput)  //換到匹配的狀態動作的話
		{
			return &m_analTable[i];
		}
	}
	return NULL;
}

/////////////////////////////////////////////////////////////////////////////
// CLexDemoView::Splitpush
//功能描述:
Status CLexDemoView::SplitPush(char * szVal)
{
	char szIn[3];
	if (strlen(szVal) > 2)
	{
		szIn[0] = szVal[0];
		szIn[1] = szVal[1];
		szIn[2] = '\0';
		m_analStack.Push(szIn);
		szIn[0] = szVal[2];
		szIn[1] = '\0';
		m_analStack.Push(szIn);
	}
	else
	{
		if (strcmp(szVal, "e"))
		{
			strcpy(szIn, szVal);
			m_analStack.Push(szIn);
		}
	}
	return OK;
}

//功能描述:模擬LL(1)語法分析方法  
//分析的字符串:i*i-i/i
void CLexDemoView::OnLlOne() 
{
	InitListBox();
	m_lstResult.AddString("分析棧");
	m_lstToken.AddString("分析動作");
	strcpy(m_szInput, "i*i-i/i#");
	m_lInputPos = 0;
	LexAnal();
}

//功能描述:模擬逆波蘭轉換過程
void CLexDemoView::OnReversePoland() 
{
	CString strSrc, strDst, strAsmOut;
	Status sRet = OK;
	strSrc = "(a+b)*c-d/2";
	//進行逆波蘭轉換
	sRet = PolandRConvert(strSrc, strDst);
  //根據逆波蘭式生成asm Code	
	MakeAsmCode(strDst, strAsmOut);   
	AfxMessageBox(strAsmOut);
}


//功能描述:逆波蘭轉換
//@arg: CString strSrc
//@arg: CString& strDst
//@return:Status
Status CLexDemoView::PolandRConvert(CString strSrc, CString& strDst)
{
	Status sRet = OK;
	int i = 0;
	int nPRI = 0;  //運算符優先級
	int length = strSrc.GetLength();
	char chInput;
	char chTop;
	char chOut;
  Stack<char> stack;
  while(i < length)
	{
		chInput = strSrc.GetAt(i);
		//如果是操作數的話.直接輸出
		if (IsOperand(chInput) && chInput != '(' && chInput != ')' )  
		{
			strDst.Insert(strDst.GetLength(), chInput);
		}
		else
		{
			//當前字符是運算符的話
			if (IsOperator(chInput))
			{
				//如果運算符棧為空的話,直接將運算符入棧
				if (stack.IsEmpty())
				{
					stack.Push(chInput);
				}
				//如果運算符棧不為空的話,就需要比較棧頂運算符與當前輸入運算符的優先級
				else 
				{
					nPRI = GetPRI(chInput);
					do
					{
						sRet = stack.Top(chTop);
						//如果當前運算符優先級>棧頂運算符優先級的話.入棧,退出循環
						if (nPRI > GetPRI(chTop) || STACK_EMPTY == sRet )
						{
							stack.Push(chInput);
							break;
						}
						//如果當前運算符優先級<=棧頂運算符優先級的話.棧頂運算符出棧,進輸出流,繼續循環
						else
						{
							stack.Pop(chOut);
							strDst.Insert(strDst.GetLength(), chOut);
						}
					}	while (1);
				}
			} //end of if (IsOperator(chInput))
			//當前字符是左括號的話
			else if ('(' == chInput) 
			{
				stack.Push(chInput);
			}
			//當前字符是右括號的話

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re这里只有精品视频首页| 日韩成人免费看| 精品黑人一区二区三区久久 | 欧美色大人视频| 一本久道久久综合中文字幕| 国产精品1区二区.| 国产成人免费9x9x人网站视频| 经典三级在线一区| 国产精品综合二区| 懂色av中文字幕一区二区三区| 国产成人在线看| jvid福利写真一区二区三区| av电影在线观看完整版一区二区| 波多野结衣在线一区| 色综合久久综合网97色综合| 91高清视频免费看| 欧美撒尿777hd撒尿| 538在线一区二区精品国产| 精品国产一区二区国模嫣然| 精品国产乱码久久久久久影片| 久久综合九色综合欧美98| 欧美国产日韩a欧美在线观看| 国产精品福利一区二区| 亚洲一区二区三区四区的| 性做久久久久久久久| 狠狠色丁香婷综合久久| 成人国产免费视频| 欧美日韩国产成人在线91| 欧美大片拔萝卜| 中文字幕永久在线不卡| 亚洲一区二区四区蜜桃| 久久99热这里只有精品| 99久久伊人网影院| 欧美一区二区三区在线看| 国产视频一区二区在线| 亚洲福利国产精品| 丰满白嫩尤物一区二区| 欧美三级蜜桃2在线观看| 久久久久久久久久久久电影| 一区二区三区精品| 国产精品88888| 欧美人与z0zoxxxx视频| 亚洲国产精品av| 日本视频在线一区| av激情亚洲男人天堂| 日韩欧美在线网站| 一区二区三区**美女毛片| 国产自产高清不卡| 欧美日韩在线播| 国产精品美女一区二区在线观看| 日本美女视频一区二区| 91免费在线播放| 欧美精品一区二区久久久| 一区二区三区四区国产精品| 国内精品嫩模私拍在线| 欧美日韩免费观看一区二区三区| 国产欧美精品一区二区色综合| 午夜国产不卡在线观看视频| www.亚洲免费av| 久久久久久久久免费| 蜜臀av性久久久久蜜臀aⅴ | 亚洲免费高清视频在线| 国产一区二区0| 在线播放日韩导航| 亚洲美女视频在线| www.日本不卡| 国产精品色一区二区三区| 国产一区二区免费在线| 欧美一区二区三区视频在线观看| 亚洲综合丁香婷婷六月香| 成人综合婷婷国产精品久久免费| 欧美一级免费大片| 日本欧美一区二区三区乱码| 欧美亚洲禁片免费| 亚洲h动漫在线| 欧美在线小视频| 亚洲免费在线视频一区 二区| 成人av电影在线观看| 国产拍揄自揄精品视频麻豆| 国产美女一区二区三区| 久久久99免费| 国产麻豆精品一区二区| 国产亚洲人成网站| 国产激情偷乱视频一区二区三区| 久久久精品黄色| 不卡视频一二三| 亚洲精品免费电影| 91老司机福利 在线| 亚洲综合免费观看高清在线观看| 在线视频国内一区二区| 亚洲国产你懂的| 日韩你懂的在线播放| 国产乱码精品一区二区三区忘忧草 | 91首页免费视频| 亚洲欧美欧美一区二区三区| 欧美专区日韩专区| 日本特黄久久久高潮 | 黄色资源网久久资源365| 精品福利av导航| 成人精品一区二区三区四区| 亚洲人成伊人成综合网小说| 在线观看视频一区| 日本aⅴ精品一区二区三区| 欧美精品一区二区三区高清aⅴ| 9i看片成人免费高清| **网站欧美大片在线观看| 色天使久久综合网天天| 五月天网站亚洲| 国产校园另类小说区| 欧美在线免费视屏| 久久成人久久鬼色| 中文字幕在线视频一区| 欧美视频在线观看一区二区| 精品一区二区综合| 亚洲日本一区二区| 日韩精品在线网站| 色老汉一区二区三区| 国内一区二区视频| 一区二区三区丝袜| 精品国产亚洲在线| 在线观看一区日韩| 国产91精品入口| 日本不卡一二三| 亚洲精品福利视频网站| 久久久青草青青国产亚洲免观| 在线中文字幕不卡| 成人午夜精品一区二区三区| 蜜桃一区二区三区在线观看| 亚洲女爱视频在线| 欧美国产激情二区三区| 日韩欧美激情一区| 欧美色爱综合网| 99精品偷自拍| 高清不卡一区二区| 麻豆精品久久精品色综合| 亚洲国产aⅴ天堂久久| 国产精品国产三级国产三级人妇 | 国产欧美在线观看一区| 欧美性高清videossexo| 91理论电影在线观看| 69久久99精品久久久久婷婷 | 亚洲综合在线第一页| 国产精品乱码一区二区三区软件| 欧美一区二区三区爱爱| 欧美色网一区二区| 欧美亚洲综合网| 色综合久久88色综合天天6| 成人一级片在线观看| 国产激情一区二区三区四区| 九九国产精品视频| 国内外成人在线视频| 极品少妇xxxx精品少妇偷拍| 久久电影网电视剧免费观看| 久久99精品国产麻豆婷婷洗澡| 婷婷成人激情在线网| 香蕉成人伊视频在线观看| 亚洲国产sm捆绑调教视频| 亚洲成a人v欧美综合天堂下载 | 白白色亚洲国产精品| 国产91富婆露脸刺激对白| 国产99久久久国产精品潘金| 国产一区日韩二区欧美三区| 国产剧情一区在线| 成人激情开心网| 9人人澡人人爽人人精品| 91捆绑美女网站| 91国偷自产一区二区三区成为亚洲经典 | 国产午夜亚洲精品不卡| 久久久久久影视| 国产精品网站导航| 自拍偷在线精品自拍偷无码专区| 亚洲精品你懂的| 青草av.久久免费一区| 久久成人18免费观看| 国产精品一区二区无线| 成人深夜福利app| 欧美午夜精品久久久久久孕妇| 欧美高清性hdvideosex| 精品1区2区在线观看| 亚洲欧美综合色| 亚洲二区在线观看| 国产精品亚洲第一区在线暖暖韩国 | 亚洲电影中文字幕在线观看| 美女脱光内衣内裤视频久久影院| 国产一区二区视频在线播放| av一二三不卡影片| 欧美精品在线一区二区三区| 精品少妇一区二区| 中文字幕一区二区三区乱码在线| 亚洲成av人影院在线观看网| 国产一区在线精品| 欧美主播一区二区三区| 精品sm在线观看| 亚洲一区欧美一区| 国产a精品视频| 欧美精品自拍偷拍| 中文字幕视频一区| 美女网站在线免费欧美精品| 色8久久人人97超碰香蕉987| 欧美va亚洲va在线观看蝴蝶网|