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

📄 ll(1).txt

📁 采用编译原理的LL(1)文法判断一个算术表达式是否正确如 113+23*3.4*(32.4-5)/23并且给出详细的栈过程显示
💻 TXT
字号:


#define E 1
#define T 2
#define E_ 3
#define T_ 4
#define F 6
#define digit 7		// 数字
#define add 8		// 左括号
#define mul 9		// 右括号
#define lb  10
#define rb	11
#define M   12
#define L   13
#define min 14
#define dev 15
#include <stdio.h>

int nStackPtr;
int stack[100];		// 栈

void Push(int n)
{
	nStackPtr ++;

	stack[nStackPtr] = n;
}

void Pop()
{
	nStackPtr--;
}

void PrintStack()
{
	int i;
	for (i = nStackPtr; i >= 0; i--) 
	{
		if (stack[i] == E) printf("E ");
		if (stack[i] == E_ ) printf("E' ");
		if (stack[i] == T ) printf("T ");
		if (stack[i] == T_ ) printf("T' ");
		if (stack[i] == F) printf("F ");
		if (stack[i] == digit) printf("digit ");
		if (stack[i] == add) printf("+ ");
		if (stack[i] == mul) printf("* ");
		if (stack[i] == lb) printf("( ");
		if (stack[i] == rb) printf(") ");
        if (stack[i]==M) printf("M ");
        if (stack[i]==L) printf("L ");
        if (stack[i]==min) printf("- ");
        if (stack[i]==dev) printf("/ ");
	}
	printf("\n");
}

/////////////////////////////////////////////////////////////////
// 利用栈来分析表达式串,判定表达式串是否正确
// 
/////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
	char strInput[100];	// 存放表达式串
	bool bResult;
	int nInputPtr;

	nStackPtr = -1;
	nInputPtr = 0;

	bResult = true;

	// 输入表达式串,存放在 strInput中
	printf("请输入表达式串:");
	scanf("%s",strInput);
	
	Push(E);
	PrintStack();	

	while (bResult && nStackPtr >= 0)
	{	
		switch(stack[nStackPtr])
		{
		case E:
           
			if (strInput[nInputPtr] >= '0' && strInput[nInputPtr] <= '9') 
			{ 
                while(strInput[nInputPtr] >= '0' && strInput[nInputPtr] <= '9')
                {
                    nInputPtr++;
                }
                nInputPtr--;
				Pop();
				Push(E_);
				Push(T);
			}
			else if (strInput[nInputPtr] == '(')
				{
                   
					Pop();
					Push(E_);
					Push(T);
				}
				else
					bResult = false;
			
			PrintStack();	
			break;
		case T:
			if (strInput[nInputPtr] >= '0' && strInput[nInputPtr] <= '9') 
			{
                while(strInput[nInputPtr] >= '0' && strInput[nInputPtr] <= '9')
                {
                    nInputPtr++;
                }
                nInputPtr--;
				Pop();
				Push(T_);
				Push(F);
			}
			else if (strInput[nInputPtr] == '(')
				{
					Pop();
					Push(T_);
					Push(F);
				} 
				else bResult = false;

			PrintStack();	
			break;

		case E_:
            if (strInput[nInputPtr] == '+'||strInput[nInputPtr]=='-')    //碰到加或者减号
			{
				Pop();
				Push(E_);
				Push(T);
				Push(M);
			}
			else if (strInput[nInputPtr] == ')' || strInput[nInputPtr] == 0) Pop();
				 else bResult = false;

			PrintStack();	
			break;	
		case T_:
			if (strInput[nInputPtr] == '+' ||strInput[nInputPtr]=='-'|| strInput[nInputPtr] == ')' || strInput[nInputPtr] == 0) Pop();
            else if (strInput[nInputPtr] == '*'||strInput[nInputPtr]=='/') 
				{
					Pop();
					Push(T_);
					Push(F);
					Push(L);
				}  
				 else bResult = false;
			PrintStack();				
			break;
		case F:
			if (strInput[nInputPtr] >= '0' && strInput[nInputPtr]<='9') 
			{
                while(strInput[nInputPtr] >= '0' && strInput[nInputPtr]<='9')
                {
                    
                    nInputPtr++;
                }
                Pop();
                nInputPtr--;
				Push(digit);
			}
			else if (strInput[nInputPtr] == '(')
				{
					Pop();
					Push(rb);
					Push(E);
					Push(lb);
				}
				else bResult = false;

			PrintStack();							
			break;
        case M:
            if(strInput[nInputPtr]=='+')
            {
                Pop();
                Push(add);
            }
            else if(strInput[nInputPtr]=='-')
            {
                Pop();
                Push(min);
            }
            else bResult = false;
            PrintStack();
            break;
        case L:
            if(strInput[nInputPtr]=='*')
            {
                Pop();
                Push(mul);
            }
            else if(strInput[nInputPtr]=='/')
            {
                Pop();
                Push(dev);
            }
            else bResult=false;
            PrintStack();
            break;
		case digit:
			if (strInput[nInputPtr] >= '0' && strInput[nInputPtr]<='9') 
			{
				Pop();
				nInputPtr++;
               
			}
			else bResult = false;
			PrintStack();	
			break;
		case add:
			if (strInput[nInputPtr] == '+')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;
			PrintStack();	
			break;
        case min:
			if (strInput[nInputPtr] == '-')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;
			PrintStack();	
			break;
		case mul:
			if (strInput[nInputPtr] == '*')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;
			PrintStack();	
			break;
        case dev:
            if (strInput[nInputPtr] == '/')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;
			PrintStack();	
			break;
		case lb:
			if (strInput[nInputPtr] == '(')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;

			PrintStack();	
			break;

		case rb:
			if (strInput[nInputPtr] == ')')  
			{
				Pop();
				nInputPtr++;
			}
			else bResult = false;

			PrintStack();	
			break;
			
		default: bResult = false; break;
		}
	}

	if (bResult == false) printf("表达式有问题了\n");
	else	printf("表达式没问题!!\n");

	

	//getch();

//	printf("Hello World!\n");
	return 0;
}

⌨️ 快捷键说明

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