⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stack.c

📁 一个程序拿来对一个C文件做基本的语法检查
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"

NODE stack = {NONE, 0, NULL};
NODE *pTop = &stack;

static void RearrangeErrorReport(void);
static BOOL isTokenMatch(TOKEN, TOKEN);
static NODE* popNode();
static void pushNode(NODE*);

static void RearrangeErrorReport(void)
{
	NODE *pPop, *pRemove;
	
	if(NULL == stack.next)
		return;
	else{
		pPop = popNode();
		if(NULL == stack.next)
			pushNode(pPop);
		else if(TRUE == isTokenMatch(pTop->token, pPop->token)){
			free(pPop);
			pPop = popNode();
			free(pPop);
			RearrangeErrorReport();
		}
		else if(TRUE == isTokenMatch(stack.next->token, pPop->token)){
			pRemove = stack.next;
			stack.next = pRemove->next;
			free(pRemove);
			free(pPop);
			RearrangeErrorReport();
		}
		else{
			RearrangeErrorReport();
			pushNode(pPop);
		}
	}
}

static BOOL isTokenMatch(TOKEN FirstToken, TOKEN SecondToken)
{
    switch(FirstToken){
        case LeftCircleBracket:
            return SecondToken == RightCircleBracket;
        case LeftSquareBracket:
            return SecondToken == RightSquareBracket;
        case LeftFlowerBracket:
            return SecondToken == RightFlowerBracket;
        case LeftCommentLine:
            return SecondToken == RightCommentLine;
        case DoubleSlashComment:
            return SecondToken == Newline;
        case SingleQuotation:
        	return SecondToken == SingleQuotation;
        case DoubleQuotation:
        	return SecondToken == DoubleQuotation;
        default:
            return FALSE;
    }
}

static NODE* popNode()
{
    NODE *pTmpNode;

    if(pTop == &stack)
        return NULL;
	else
		pTmpNode = &stack;
    while(pTop != pTmpNode->next)
        pTmpNode = pTmpNode->next;

    pTop = pTmpNode;
    pTmpNode = pTop->next;
    pTop->next = NULL;
	stack.line--;

	return pTmpNode;
}

static void pushNode(NODE* pNewNode)
{
    pTop->next = pNewNode;
    pTop = pNewNode;
	stack.line++;
}

void PrintError(void)
{
	NODE *pTmp, *pRemove;
	UINT32 OldNodeNb;
	
	if(stack.next == NULL)
		printf("The file pass parse successfully\n");
	else{
		do{
			OldNodeNb = stack.line;
			RearrangeErrorReport();
		} while(OldNodeNb != stack.line);
		for( pRemove = stack.next ; pRemove ; pRemove = pTmp ){
			printf("Line %d: There is no matched symbol for ", pRemove->line);
			switch(pRemove->token){
				case LeftCircleBracket:
					printf("\'(\'\n");
					break;
    			case RightCircleBracket:
					printf("\')\'\n");
					break;
    			case LeftSquareBracket:
					printf("\'[\'\n");
					break;
    			case RightSquareBracket:
					printf("\']\'\n");
					break;
    			case LeftFlowerBracket:
					printf("\'{\'\n");
					break;
    			case RightFlowerBracket:
					printf("\'}\'\n");
					break;
    			case LeftCommentLine:
					printf("\'/*\'\n");
					break;
    			case RightCommentLine:
					printf("\'*/\'\n");
					break;
    			case DoubleSlashComment:
					printf("\'//\'\n");
					break;
    			case Newline:
					printf("\'\\n\'\n");
					break;
    			case SingleQuotation:
 					printf("\'\'\'\n");
					break;
   				case DoubleQuotation:
					printf("\'\"\'\n");
					break;
			}
			pTmp = pRemove->next;
			free(pRemove);
		}
	}
}

void push(TOKEN token, UINT32 line)
{
    NODE *pNewNode = (NODE*)malloc(sizeof(NODE));

    pNewNode->token = token;
    pNewNode->line = line;
    pNewNode->next = NULL;
	pushNode(pNewNode);
}

TOKEN pop()
{
	NODE *pTmpNode = popNode();
	TOKEN token;

	if(NULL == pTmpNode)
		return NONE;
	else{
		token = pTmpNode->token;
		free(pTmpNode);
		return token;
	}
}

BOOL isTokenMatchTop(TOKEN token)
{
	if(NULL == stack.next)
		return FALSE;
	else
		return isTokenMatch(pTop->token, token);
}


typedef enum {
	eNULL,			// Normal state
	eSlashFound,	// Find a slash '/'
	eStarFound,		// Find a star '*'
	eBackSlashFound
} ePARSESTATE;

TOKEN GetNextToken(BYTE **pSrc, BYTE *pEnd, TOKEN PreferToken)
{
	static ePARSESTATE eParseState = eNULL;
	TOKEN ResultToken = NONE;
		
	for(  ; *pSrc < pEnd ; (*pSrc)++ ){
		switch(**pSrc){
			case cBACKSLASH_SYMBOL:
				if(eBackSlashFound == eParseState)
					eParseState = eNULL;
				else
					eParseState = eBackSlashFound;
				break;
 			case cSLASH_SYMBOL:
 				switch(eParseState){
 					case eNULL:
 						eParseState = eSlashFound;
 						break;
 					case eSlashFound:
 						eParseState = eNULL;
 						ResultToken = DoubleSlashComment;
 						break;
 					case eStarFound:
 						eParseState = eNULL;
 						ResultToken = RightCommentLine;
 						break;
 				}
 				break;
 			case cSTAR_SYMBOL:
 				switch(eParseState){
 					case eNULL:
 						eParseState = eStarFound;
 						break;
 					case eSlashFound:
 						eParseState = eNULL;
 						ResultToken = LeftCommentLine;
 						break;
 				}
 				break;
 			case cNEWLINE_SYMBOL:
 				eParseState = eNULL;
 				ResultToken = Newline;
 				break;
 			case cLEFT_CIRCLEBRACKET:
 				eParseState = eNULL;
 				ResultToken = LeftCircleBracket;
 				break;
 			case cRIGHT_CIRCLEBRACKET:
 				eParseState = eNULL;
 				ResultToken = RightCircleBracket;
 				break;
 			case cLEFT_SQUAREBRACKET:
 				eParseState = eNULL;
 				ResultToken = LeftSquareBracket;
 				break;
 			case cRIGHT_SQUAREBRACKET:
 				eParseState = eNULL;
 				ResultToken = RightSquareBracket;
 				break;
 			case cLEFT_FLOWERBRACKET:
 				eParseState = eNULL;
 				ResultToken = LeftFlowerBracket;
 				break;
 			case cRIGHT_FLOWERBRACKET:
 				eParseState = eNULL;
 				ResultToken = RightFlowerBracket;
 				break;
 			case cSINGLE_QUOTATION:
 				if(eBackSlashFound != eParseState)
 					ResultToken = SingleQuotation;
 				eParseState = eNULL;
 				break;
 			case cDOUBLE_QUOTATION:
 				if(eBackSlashFound != eParseState)
 					ResultToken = DoubleQuotation;
 				eParseState = eNULL;
 				break;
 			default:
 				eParseState = eNULL;
 				break;
 		}
 
 		if((NONE != ResultToken) &&
 		   ((NONE == PreferToken) || 
 		    (Newline == ResultToken) ||
 		    (PreferToken == ResultToken))){
 			(*pSrc)++;
 			return ResultToken;
 		}
 	}
 	
 	return NONE;
 }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -