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

📄 parser.h

📁 编译器中算符优先算法的简单实现
💻 H
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SUCCESS 1
#define ERROR 0
#define MAXINPUT 300
#define MAXSTACK 100 

char stack[MAXSTACK],a[MAXINPUT]; //stack[]为分析栈,a[]为输入串

/*******算符优先矩阵*******/
int M_Table[8][8] = { /*说明:大于关系为1,小于关系为-1,等于关系为2,出错关系为0*/
	{ 1, 1,-1,-1,-1, 1,-1, 1},
	{ 1, 1,-1,-1,-1, 1,-1, 1},
	{ 1, 1, 1, 1,-1, 1,-1, 1},
	{ 1, 1, 1, 1,-1, 1,-1, 1},
	{-1,-1,-1,-1,-1, 2,-1, 0},
	{ 1, 1, 1, 1, 0, 1, 0, 1},
	{ 1, 1, 1, 1, 0, 1, 0, 1},
	{-1,-1,-1,-1,-1, 0,-1, 2}
};


//将字符转为在算符优先矩阵中的下标
int TransToPos(char ch)
{
	int pos;
	switch(ch)
	{
	case '+':
		pos = 0;
		break;
	case '-':
		pos = 1;
		break;
	case '*':
		pos = 2;
		break;
	case '/':
		pos = 3;
		break;
	case '(':
		pos = 4;
		break;
	case ')':
		pos = 5;
		break;
	case 'i':
		pos = 6;
		break;
	case '#':
		pos = 7;
		break;
	default:
		pos = -1;
	}
	return pos;
}

//是否为终结符号
int IsVt(char ch)
{
	if(ch == 'i' || ch == '+' || ch == '-' || ch == '*' || 
	   ch == '/' || ch == '(' || ch == ')' || ch == '#')
		return 1;
    else 
		return 0;
}

//进行规约,返回规约产生式的左部
char Reduce(int begin,int end,int len)
{
	char str = ' ';
	if(len == 3){
		if(stack[begin+1] == '+' || stack[begin+1] == '-')
			str = 'E';
		else if(stack[begin+1] == '*' || stack[begin+1] == '/')
			str = 'T';
		else if(stack[begin] == '(' && stack[begin+2] == ')')
			str = 'F';
		else
			str = ' ';
	}
	else if(len == 1){
		if(stack[begin] == 'i')
			str = 'F';
		else
			str = ' ';
	}
	else
		str = ' ';
	return str;
}

//是否为大于关系
int IsHigherThan(char m,char n)
{
	int mm,nn;
	mm = TransToPos(m);
	nn = TransToPos(n);
	if(M_Table[mm][nn] == 1)
		return 1;
	return 0;
}

//是否为小于关系
int IsLowerThan(char m,char n)
{
	int mm,nn;
	mm = TransToPos(m);
	nn = TransToPos(n);
	if(M_Table[mm][nn] == -1)
		return 1;
	return 0;
}

//是否为等于关系
int IsEqualTo(char m,char n)
{
	int mm,nn;
	mm = TransToPos(m);
	nn = TransToPos(n);
	if(M_Table[mm][nn] == 2)
		return 1;
	return 0;
}

⌨️ 快捷键说明

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