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

📄 analysis.h

📁 编译器中LL(1)算法的简单实现
💻 H
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define M  7  //非终结符号数                         
#define N  8  //终结符号数

char buff[SIZE]; //输入串

char currChar;  //当前分析的字符

int step = 0; //当前分析的步骤数

char* M_LL1[M][N] = {" "};  //LL(1)分析表,D代表E',G代表T'

int index = 0; //指示当前分析的字符

char stack[SIZE]; //字符栈

int top = 0; //栈顶标志

void pop();

//初始化栈
void InitStack()
{
	while(top >0)
		pop();
}

//入栈
void push(char ch)
{
	if(top >= 0 && top != SIZE){
		stack[top] = ch;
		top++;
	}
}

//出栈
void pop()
{
	if(top > 0){
		stack[top] = '\0';
		top--;
	}
}

//转换非终结符号为相应的下标
int transFeiZhongjie(char ch)
{
	switch(ch){
	case 'E':
		return 0;
		break;
	case 'D':
		return 1;
		break;
	case 'T':
		return 2;
		break;
	case 'G':
		return 3;
		break;
	case 'F':
		return 4;
		break;
	case 'A':
		return 5;
		break;
	case 'M':
		return 6;
		break;
	default:
		return -1;
	}
}

//转换终结符号为相应的下标
int transZhongjie(char ch)
{
	switch(ch){
	case 'i':
		return 0;
		break;
	case '+':
		return 1;
		break;
	case '-':
		return 2;
		break;
	case '*':
		return 3;
		break;
	case '/':
		return 4;
		break;
	case '(':
		return 5;
		break;
	case ')':
		return 6;
		break;
	case '#':
		return 7;
		break;
	default:
		return -1;
	}
}

//判断是否为终结符号
bool is_terminate(char ch)
{
	if(ch == 'i' || ch == '+' || ch == '-' || ch == '*' || ch == '('
		         || ch == ')' || ch == '/' || ch == '#')
		return true;
	return false;
}

//判断是否为非终结符号
bool is_non_Terminate(char ch)
{
	if(ch == 'E' || ch == 'D' || ch == 'T' || ch == 'G' || 
		         ch == 'F' || ch == 'A' || ch == 'M')
		return true;
	return false;
}
 
//初始化LL(1)分析表
void InitLL1Table()
{
	M_LL1[0][0] = "TD";   //D代表E'
	M_LL1[0][5] = "TD";

	M_LL1[1][1] = "ATD";
	M_LL1[1][2] = "ATD";
	M_LL1[1][6] = "e";   //e代表单ε
	M_LL1[1][7] = "e";

	M_LL1[2][0] = "FG";  //G代表T'
	M_LL1[2][5] = "FG";

	M_LL1[3][1] = "e";
	M_LL1[3][2] = "e";
	M_LL1[3][3] = "MFG";
	M_LL1[3][4] = "MFG";
	M_LL1[3][6] = "e";
	M_LL1[3][7] = "e";

	M_LL1[4][0] = "i";
	M_LL1[4][5] = "(E)";


	M_LL1[5][1] = "+";
	M_LL1[5][2] = "-";

	M_LL1[6][3] = "*";
	M_LL1[6][4] = "/";

}

⌨️ 快捷键说明

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