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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? lr1.cpp

?? 以lr1分析法,按照給定的文法分析單詞序列是否合乎語(yǔ)法要求,將每一步分析打印出來,并給出最后結(jié)果.
?? CPP
字號(hào):
1// LR1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "CharStack.h"
#include "IntStack.h"
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct BNFNODE	// 產(chǎn)生式節(jié)點(diǎn)
{
	char	Left;					// 產(chǎn)生式左部
	char	Right[MAX_DATA_LEN];	// 產(chǎn)生式右部
	int		RLen;					// 產(chǎn)生式右邊長(zhǎng)度
} m_Bnf[MAX_DATA_LEN];
int	m_nBnfLen;

enum ACTIONTYPE	// 動(dòng)作類別
{
	Push,		// 移進(jìn)
	Sumup,		// 規(guī)約
	Accept,		// 接受
	Error		// 出錯(cuò)
};

struct LR1TABLE
{
	int		nStatus;		// 狀態(tài)
	char	CurChar;		// 當(dāng)前符號(hào)
	ACTIONTYPE	ActionType;	// 動(dòng)作類別
	int		nNextStatus;	// 下一狀態(tài)
} m_Lr1[MAX_DATA_LEN];
int		m_nLr1Len;

/*****************************************************
* 以下是詞法分析文件操作
******************************************************/
// 清空鏈表
void ClearWords(WORDNODE *pHeader)
{
	WORDNODE *pNode;

	while (pHeader != NULL)
	{
		pNode = pHeader->pNext;
		free(pHeader);
		pHeader = pNode;
	}
}

// 增加結(jié)點(diǎn)
WORDNODE* AddNode(char c[], WORDNODE *pTail)
{
	// c第0個(gè)字節(jié)為單詞類別,第1個(gè)為逗號(hào),第2個(gè)以后是值

	WORDNODE *pNode = (WORDNODE *)malloc(sizeof(WORDNODE));
	pNode->byType = c[0] - '0';
	pNode->pNext = NULL;

	int nChars = MAX_DATA_LEN - 2;
	memcpy(pNode->Value, &c[2], nChars);

	pTail->pNext = pNode;
	return pNode;
}

bool ReadWords(char FileName[], WORDNODE *pHeader)
{
	// 打開文件
	FILE *f = fopen(FileName, "r");
	if (f == NULL)
	{
		ClearWords(pHeader);
		return false;
	}

	WORDNODE *pTail = pHeader;
	char c[MAX_DATA_LEN];

	// 讀取數(shù)據(jù)
	while (!feof(f))             //未到文件尾
	{
		fscanf(f, "%s\n", c);
		pTail = AddNode(c, pTail);
		printf("%s\n", c);
	}

	// 關(guān)閉文件
	fclose(f);

	// 增加一個(gè)結(jié)束符
	c[0] = WT_OPERATOR + '0';
	c[1] = ',';
	c[2] = '#';
	c[3] = '\0';
	AddNode(c, pTail);

	return true;
}

/*****************************************************
* 以下是文法文件操作
******************************************************/
char *ReadFile(char FileName[], int *nLen)
{
	// 打開文件
	FILE *f = fopen(FileName, "r");
	if (f == NULL)
		return NULL;

	// 讀取文件
	char *pChar = (char *)malloc(sizeof(char) * MAX_DATA_LEN);
	
	// 讀取數(shù)據(jù)
	int nRead;
	*nLen = 0;
	while (!feof(f))
	{
		nRead = fread(pChar + *nLen, sizeof(char), MAX_DATA_LEN, f);
		*nLen += nRead;
		if (nRead < MAX_DATA_LEN)	// 文件結(jié)尾
			break;

		pChar = (char *)realloc(pChar, *nLen + sizeof(char) * MAX_DATA_LEN);
	}

	// 關(guān)閉文件
	fclose(f);

	return pChar;
}

bool ReadBnfs()
{
	// 讀取文件
	int nLen;
	char *pChar = ReadFile("Bnf.txt", &nLen);
	if (pChar == NULL)
		return false;
	
	// 解析出文法產(chǎn)生式
	int nBegin, nCur, nIndex = 0;
	for (nBegin = 0, nCur = 0; nCur < nLen; nCur++)
	{
		// 左部
		m_Bnf[nIndex].Left = pChar[nCur];

		// 右部
		nCur += 2;
		nBegin = nCur;
		for (; pChar[nCur] != ';'; nCur++);
		m_Bnf[nIndex].RLen = nCur - nBegin;
		memcpy(m_Bnf[nIndex].Right, pChar + nBegin, m_Bnf[nIndex].RLen);
		m_Bnf[nIndex].Right[m_Bnf[nIndex].RLen] = '\0';

		nIndex++;
	}
	m_nBnfLen = nIndex;

	return true;
}

/*****************************************************
* 以下是LR(1)分析表文件操作
******************************************************/
ACTIONTYPE	GetActionType(char c)
{
	if (c >= '0' && c <= '9')
		return Push;

	switch (c)
	{
	case 'S':
		return Push;
	case 'r':
		return Sumup;
	case 'a':
		return Accept;
	}

	return Error;
}

bool ReadLR1()
{
	// 讀取文件
	int nLen;
	char *pChar = ReadFile("Lr1.Lr1", &nLen);
	if (pChar == NULL)
		return false;

	// 解析出分析表
	int nBegin, nCur, nIndex = 0;
	for (nBegin = 0, nCur = 0; nCur < nLen; nCur++)
	{
		// 狀態(tài)
		m_Lr1[nIndex].nStatus = atoi(&pChar[nCur]);
		for (; pChar[nCur] != ';'; nCur++);
		nCur++;

		// 符號(hào)
		m_Lr1[nIndex].CurChar = pChar[nCur];
		nCur += 2;

		// 動(dòng)作類別
		m_Lr1[nIndex].ActionType = GetActionType(pChar[nCur]);
		if (pChar[nCur] == 'a')
		{
			nCur += 3;
			m_Lr1[nIndex].nNextStatus = 0;
		}
		else
		{
			if (pChar[nCur] == 'S' || pChar[nCur] == 'r')
				nCur++;
			// 狀態(tài)轉(zhuǎn)換
			m_Lr1[nIndex].nNextStatus = atoi(&pChar[nCur]);
			for (; pChar[nCur] != ';'; nCur++);
		}

		nIndex++;
	}
	m_nLr1Len = nIndex;

	return true;
}

/********************************************************
* 以下是語(yǔ)法分析部分
*********************************************************/
/************************************************
* 獲取當(dāng)前單詞符號(hào):
* 如果是整數(shù)或標(biāo)識(shí)符,返回'i'
* 如果是算法,返回算法
*************************************************/
char GetCurChar(WORDNODE *pNode)
{
	switch (pNode->byType)
	{
	case WT_OPERATOR:	// 操作符
		return pNode->Value[0];
	case WT_UINT:		// 整數(shù)
	case WT_VARIABLE:	// 變量
		return 'i';
	}

	return '\0';
}

int GetLR1Index(int nStatus, char a)
{
	for (int i = 0; i < m_nLr1Len; i++)
	{
		if (m_Lr1[i].nStatus == nStatus && m_Lr1[i].CurChar == a)
			return i;
	}
	return -1;
}

// 打印狀態(tài)
void PrintState(WORDNODE *pNode, int nBnfIndex)
{
	PrintIntStack();
	PrintCharStack();

	WORDNODE *pPrint = pNode;
	int nCount = 0;
	while (pPrint != NULL)
	{
		printf("%c", GetCurChar(pPrint));
		pPrint = pPrint->pNext;
		nCount++;
	}
	for (; nCount < 12; nCount++)
		printf(" ");

	if (nBnfIndex == -1)
	{
		if (GetCurChar(pNode) == 'i')
			printf("i=%s", pNode->Value);
	}
	else
		printf("%c-->%s", m_Bnf[nBnfIndex].Left, m_Bnf[nBnfIndex].Right);

	printf("\n");
}

bool LR1Analysis(WORDNODE *pHeader)
{
	InitIntStack();				//初始化狀態(tài)棧
	PushInt(0);					//0狀態(tài)入棧
	InitCharStack();			//初始化符號(hào)棧
	PushChar('#',NULL);			//'#'符號(hào)入棧

	WORDNODE * pNode=pHeader->pNext;			//pNode指向當(dāng)前單詞結(jié)點(diǎn)
	PrintState(pNode,-1);						//打印,-1表示第一步不會(huì)為歸約
	
	int LR1_Index;								//記錄查詢LR1分析表后得到的數(shù)組下標(biāo)
	while(1)
	{
		LR1_Index=GetLR1Index(TopInt(),GetCurChar(pNode));
						//根據(jù)棧頂狀態(tài)TopInt()和當(dāng)前符號(hào)GetCurChar(pNode),查詢分析表
		
		if(LR1_Index==-1) return false;		//查詢不成功

		if(m_Lr1[LR1_Index].ActionType==Push)
		{
			//查詢LR1分析表得到的動(dòng)作為移進(jìn)
			PushInt(m_Lr1[LR1_Index].nNextStatus);			//將LR1分析表指示的狀態(tài)移進(jìn)狀態(tài)棧			
			if(GetCurChar(pNode)=='i') PushChar('i',pNode);	//若當(dāng)前單詞為數(shù)字或標(biāo)識(shí)符,將當(dāng)前符號(hào)和當(dāng)前單詞指針移進(jìn)符號(hào)棧,
			else PushChar(GetCurChar(pNode),NULL);			//若當(dāng)前單詞為運(yùn)算符,只將該運(yùn)算符移進(jìn)符號(hào)棧

			pNode=pNode->pNext;			//指向下一單詞

			PrintState(pNode,-1);		//打印狀態(tài),因?yàn)榇瞬綖橐七M(jìn)動(dòng)作,所以不會(huì)用到產(chǎn)生式,所以傳遞參數(shù)-1
		}

		else if(m_Lr1[LR1_Index].ActionType==Sumup)
		{
			//查詢LR1分析表得到的動(dòng)作為歸約
			for(int i=1;i<=m_Bnf[m_Lr1[LR1_Index].nNextStatus].RLen;i++)
			{
				//從狀態(tài)棧和符號(hào)棧各彈出 m_Bnf[m_Lr1[LR1_Index].nNextStatus].RLen 個(gè)元素
				PopChar();
				PopInt();
			}

			PushChar(m_Bnf[m_Lr1[LR1_Index].nNextStatus].Left,NULL);	//將產(chǎn)生式左部的非終結(jié)符入符號(hào)棧
			
			int n=GetLR1Index(TopInt(),TopChar()->cCur);
								//根據(jù)狀態(tài)棧棧頂狀態(tài)和符號(hào)棧棧頂符號(hào)查詢LR1分析表,確定轉(zhuǎn)移狀態(tài)
			
			if(n==-1)return false;		//查詢不成功
			PushInt(m_Lr1[n].nNextStatus);		//將LR1分析表指示的轉(zhuǎn)移狀態(tài)入狀態(tài)棧

			PrintState(pNode,m_Lr1[LR1_Index].nNextStatus);		//打印,m_Lr1[LR1_Index].nNextStatus為此步用到的產(chǎn)生式
		}

		else
		{
			////查詢LR1分析表得到的動(dòng)作為接受acc,返回true,語(yǔ)法分析成功
			return true;
		}
	}
	

}

int main(int argc, char* argv[])
{
	// 輸入文件名
	char FileName[MAX_DATA_LEN];
	printf("請(qǐng)輸入詞法分析的文件名:\n");
	scanf("%s", FileName);

	// 讀取文件
	printf("單詞序列:\n");
	WORDNODE *pHeader = (WORDNODE *)malloc(sizeof(WORDNODE));
	if (!ReadWords(FileName, pHeader))
	{
		printf("讀取詞法分析文件失敗!\n");
		ClearWords(pHeader);
		return 0;
	}

	// 讀取文法
	if (!ReadBnfs())
	{
		printf("讀取產(chǎn)生式失敗!\n");
		ClearWords(pHeader);
		return 0;
	}

	// 讀取LR(1)分析表
	if (!ReadLR1())
	{
		printf("讀取LR(1)分析表失敗!\n");
		ClearWords(pHeader);
		return 0;
	}

	// 語(yǔ)法分析
	printf("語(yǔ)法分析過程:\n");
	printf("狀態(tài)棧                                       歸約串         輸入串      產(chǎn)生式\n");
	if (LR1Analysis(pHeader))
		printf("語(yǔ)法分析成功!\n");
	else
		printf("語(yǔ)法分析失敗!\n");

	// 清空鏈表
	ClearWords(pHeader);

	getchar();
	getchar();

	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性做爰猛烈叫床潮| 欧美日韩成人在线| 婷婷六月综合网| 欧美激情在线看| 7777女厕盗摄久久久| 成人黄色电影在线| 久久99精品久久只有精品| 中文字幕一区二区三| 日韩欧美电影一二三| 91啦中文在线观看| 男女男精品网站| 亚洲激情欧美激情| 国产欧美精品一区| 欧美电影免费观看高清完整版在 | 日韩欧美成人激情| 日本韩国视频一区二区| 国产999精品久久| 久久99久久99| 日本伊人精品一区二区三区观看方式| 亚洲人成网站影音先锋播放| 2020国产精品| 欧美α欧美αv大片| 欧美日韩第一区日日骚| 91极品视觉盛宴| 99精品视频在线播放观看| 国产一区二区在线观看免费| 免费观看在线综合色| 日韩一区欧美二区| 亚洲成av人片一区二区| 亚洲一区日韩精品中文字幕| 亚洲人成伊人成综合网小说| 国产精品伦理在线| 国产精品美女久久久久久久久久久| 欧美精品一区二区三区四区 | 亚洲一区二区三区四区在线免费观看| 国产精品你懂的在线| 久久久精品欧美丰满| 久久色在线观看| 日韩精品一区二区三区在线观看| 欧美一级二级三级蜜桃| 7777女厕盗摄久久久| 日韩一区二区三区电影| 欧美精品乱码久久久久久| 欧美日韩激情在线| 欧美日韩高清影院| 欧美一区二区三区视频免费播放| 在线不卡欧美精品一区二区三区| 欧美日韩国产另类不卡| 欧美一区二区视频在线观看2020| 欧美精品18+| 日韩欧美黄色影院| 久久影院视频免费| 欧美国产日韩a欧美在线观看| 中文字幕av一区二区三区| 1024成人网| 亚洲资源在线观看| 日本欧洲一区二区| 国产在线观看免费一区| 国产福利电影一区二区三区| 成人白浆超碰人人人人| 91久久精品网| 91麻豆精品国产91久久久久久| 精品日韩一区二区三区| 亚洲国产高清aⅴ视频| 亚洲欧美日韩小说| 水蜜桃久久夜色精品一区的特点| 男女性色大片免费观看一区二区| 狠狠狠色丁香婷婷综合激情 | 欧美电影影音先锋| 精品国产一区二区三区忘忧草| 欧美国产一区视频在线观看| 亚洲女同一区二区| 美日韩一区二区三区| 国产91高潮流白浆在线麻豆 | 欧美日韩久久一区二区| 欧美成人精品高清在线播放| 久久综合丝袜日本网| 亚洲欧洲色图综合| 蜜臀av性久久久久av蜜臀妖精| 国产一区二区三区蝌蚪| 色拍拍在线精品视频8848| 日韩欧美在线综合网| 亚洲欧洲精品天堂一级| 日本少妇一区二区| 99久久婷婷国产综合精品电影| 欧美福利电影网| 中文字幕av一区二区三区| 午夜久久久影院| 成人黄色在线看| 欧美一区二区女人| 最新国产精品久久精品| 久热成人在线视频| 在线欧美一区二区| 国产午夜精品理论片a级大结局| 亚洲一区在线观看视频| 国产成人综合网| 欧美一区二区三区喷汁尤物| 国产精品久久久久久妇女6080 | 99视频精品在线| 91精品国产一区二区三区香蕉| 国产精品家庭影院| 九九视频精品免费| 欧美日韩一区二区电影| 国产精品亲子乱子伦xxxx裸| 奇米精品一区二区三区在线观看一| 91在线观看污| 久久精品一区二区三区不卡牛牛| 午夜精品久久久久久不卡8050| 成人午夜电影久久影院| 日韩精品一区二区三区在线| 亚洲国产一二三| 91亚洲国产成人精品一区二三 | 国产精品久久毛片a| 免费观看在线综合| 欧美少妇xxx| 粉嫩蜜臀av国产精品网站| 欧美日韩dvd在线观看| 亚洲色图在线播放| 白白色 亚洲乱淫| 国产亚洲一区二区在线观看| 日本不卡的三区四区五区| 欧美日韩一级大片网址| 亚洲激情图片小说视频| 97se亚洲国产综合自在线不卡| 国产女同性恋一区二区| 国产一区二区视频在线| 欧美tickling挠脚心丨vk| 在线观看亚洲一区| ㊣最新国产の精品bt伙计久久| 成人激情文学综合网| 国产欧美视频一区二区| 国产麻豆成人精品| 久久欧美中文字幕| 国产高清在线精品| 欧美国产精品v| 成人性生交大片免费看中文网站| 国产亚洲女人久久久久毛片| 国产一区二区三区观看| 久久久久久久久99精品| 国产在线精品国自产拍免费| 久久久噜噜噜久久中文字幕色伊伊 | 久久综合色婷婷| 黄色精品一二区| 久久久久久久综合| 丰满少妇久久久久久久| 国产精品无圣光一区二区| 成人app网站| 亚洲特黄一级片| 91久久国产综合久久| 亚洲一区国产视频| 欧美精品成人一区二区三区四区| 日本vs亚洲vs韩国一区三区| 精品理论电影在线观看 | 日韩女优av电影在线观看| 精品综合久久久久久8888| 欧美成人一区二区三区在线观看| 久久99最新地址| 中文在线资源观看网站视频免费不卡| 成人黄色a**站在线观看| 亚洲卡通欧美制服中文| 欧美撒尿777hd撒尿| 麻豆国产欧美日韩综合精品二区| 久久久久88色偷偷免费| 懂色av一区二区夜夜嗨| 亚洲精品国产一区二区精华液| 欧美日韩久久久一区| 精品一区免费av| 国产精品久久久久一区二区三区共| 在线免费一区三区| 麻豆精品视频在线观看视频| 国产日韩欧美精品电影三级在线| 97精品国产露脸对白| 日韩精品国产精品| 中文字幕乱码亚洲精品一区 | 成人va在线观看| 亚洲18女电影在线观看| 久久在线观看免费| 色噜噜狠狠成人中文综合| 免费看日韩精品| 日韩一区有码在线| 欧美福利一区二区| gogo大胆日本视频一区| 天天操天天色综合| 国产精品久久夜| 日韩欧美一级片| 99精品一区二区三区| 美日韩一区二区| 亚洲欧美一区二区久久 | 欧美日韩国产电影| 粉嫩绯色av一区二区在线观看| 亚洲自拍偷拍综合| 免费一区二区视频| 欧美性猛交xxxx乱大交退制版| 亚洲综合自拍偷拍| 精品国产免费人成在线观看| 91视频在线观看| 国内精品在线播放| 午夜精品久久久久影视| 国产精品丝袜在线| 欧美va亚洲va在线观看蝴蝶网|