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

📄 ddddd.cpp

📁 词法分析器
💻 CPP
字号:
// 孙扬.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#define MAX_DATA_LEN 100
void Prefix(char c[])
{
	for (int i = 0, j = 0; j < MAX_DATA_LEN && c[j] != '\0'; j++)
	{
		if (c[j] != ' ')
			c[i++] = c[j];
	}
	c[i] = '\0';
}
#include<malloc.h>
#include<memory.h>
#define WT_OPERATOR		0	// 操作符
#define WT_UINT			1	// 非负整数
#define WT_VARIABLE			2	// 变量

#define DFA_STATUS_ERR		255	// 错误状态

struct WORDNODE
{
	unsigned short byType;			// 类别
	char Value[MAX_DATA_LEN];		// 值
	WORDNODE *pNext;			// 下一结点
};
int IsNumChar(char b)
{ 
	int a=(int) b;
	if(0<<a<<9) {return 1;}
    else return 0;
}

int GetInt(char c[],int d)////////////////////////////////////////////////////
{      
	return 1;
}

void Clear(WORDNODE *pHeader)
{
	WORDNODE *pNode;

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

int IsEnglishChar(char m)
{
	if ('a'<<m<<'z') {
		return 1;
	}
     else return 0;
}


int GetVariableStatus(char c, int nStatus)
{
	switch (nStatus)
	{
	case 0:
		if (IsEnglishChar(c) || c == '_')
			return 1;
		else
			return DFA_STATUS_ERR;
	case 1:
		if (IsNumChar(c) || IsEnglishChar(c) || c == '_')
			return 1;
		else
			return 2;
	}
	return DFA_STATUS_ERR;
}
int GetVariable(char c[], int nCur)
{
	int nStatus = 0;
	for (; nCur < MAX_DATA_LEN; nCur++)
	{
		nStatus = GetVariableStatus(c[nCur], nStatus);
		switch (nStatus)
		{
		case 2:
			return nCur - 1;
		case DFA_STATUS_ERR:
			return -1;
		}
	}

	return nCur;
}
WORDNODE* AddNode(char c[], int nBegin, int nEnd, unsigned short byType, WORDNODE *pTail)
{

	WORDNODE *pNode = 
		(WORDNODE *)malloc(sizeof(WORDNODE));
	pNode->byType = byType;
	pNode->pNext = NULL;

	int nChars = nEnd - nBegin + 1;
	memcpy(pNode->Value, &c[nBegin], nChars);
	pNode->Value[nChars] = '\0';

	pTail->pNext = pNode;
	return pNode;
}


int IsOperator(char ch)
{
	switch(ch){
	case '+': return 1;
	case '-': return 1;
	case '*': return 1;
	case '/': return 1;
	default: return 0;
	}

}

WORDNODE* WordAnalysis(char c[])
{

WORDNODE *pHeader = (WORDNODE *)malloc(sizeof(WORDNODE));
pHeader->pNext = NULL;
WORDNODE *pTail = pHeader, *pNode = NULL;
// 词法分析
char cCur;

for (int nCur1 = 0, nEnd; nCur1 < MAX_DATA_LEN; nCur1++)
{
	cCur = c[nCur1];	// 空间换时间,防止每个if都要计算数组下标

	if (IsNumChar(cCur))											// 整数
	{
		if ((nEnd = GetInt(c, nCur1)) == -1)	// 出错
		{
			Clear(pHeader);
			return NULL;
		}
		pTail = AddNode(c, nCur1, nEnd, WT_UINT, pTail);
		nCur1 = nEnd;
	}else if (IsEnglishChar(cCur) || cCur == '_')
	{						// 标识符
	         if ((nEnd = GetVariable(c, nCur1)) == -1) 
			 {// 出错
		         Clear(pHeader);
		         return NULL;
			 }
	         pTail = AddNode(c, nCur1, nEnd, WT_VARIABLE, pTail);
	         nCur1 = nEnd;
	}
	else if (IsOperator(cCur))										// 算符
	       pTail = AddNode(c, nCur1, nCur1, WT_OPERATOR, pTail);
    else if (cCur == '\0')		// 结束
	       return pHeader;
	else	// 出错
	{
		Clear(pHeader);
		return NULL;
	}
}
   return pHeader;
}
/***********************************************************************************
* 函数功能:在链表中增加一个结点。#include <memory.h>
* 入口参数:略。
* 返  回  值:新增结点指针。
***********************************************************************************/


/*****************************************
* 函数功能:标识符(变量)识别
* 入口参数:c 缓冲区;	nCur 扫描器当前字符位置
* 返 回 值:标识符结束位置,-1表示出错
*****************************************/
 

/*****************************************
* 函数功能:标识符(变量)状态跳转。为与DFA相一致,此函数未优化。
* 入口参数:c 当前字符;nStatus 当前状态
* 返 回 值:下一状态
*****************************************/

/*bool Save(WORDNODE *pHeader)
{
	// 打开文件
	FILE *f = fopen("Words.txt", "w");
	if (f == NULL)
	{
		Clear(pHeader);
		return false;
	}
	// 空出第一个结点
	WORDNODE *pNode = pHeader->pNext;
	// 保存数据
	while (pNode != NULL)
	{
		fprintf(f, "%c,%s\n", pNode->byType + '0', pNode->Value);
		pNode = pNode->pNext;
	}
	// 关闭文件
	fclose(f);
	return true;
}*/
// 清空链表
int main()//int argc, char* argv[])
{
	WORDNODE *h;
	char c[]={'x','y','-','(','x','-','1','0','0',')','/','2'};
	h=WordAnalysis(c);
	while(h->pNext!=NULL){
		printf("dddddddddddddd\n");
		printf(h->Value);
		h=h->pNext;
	}
	 return 0;
}

⌨️ 快捷键说明

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