📄 parser.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 + -