1、完整word版)编译原理算符优先分析C++源代码
算符优先分析器源代码:
#include
#include
#define MAX 100
using namespace std;
struct Stack //符号栈
{
char data[MAX];
int top;
};
char Terminal[6]={';','(',')','a','+','#'}; //终结符集合
char Table[6][6]={ //算符优先关系表
{'>', '<', '>', '<', '>', '>'},
{'<',
2、 '<', '=', '<', '<', '!'},
{'>', '>', '>', '!', '>', '>'},
{'>', '>', '>', '!', '>', '>'},
{'<', '<', '>', '<', '>', '!'},
{'<', '<', '!', '<', '!', '='}
};
//判断是否为终结符,是返回其所在位置i,否则返回-1
int Is_Vt(char ch,char Terminal[6])
{
int i;
for(i=0;i<6;i++)
{
if(ch==Terminal[i]) //输入符为终结符
3、
return i;
}
return -1;
}
//读入输入串,返回其长度
int Getchar(int length,char String[MAX])
{
int i;
cout<<"*****输入字符串的长度length=";
cin>>length;
cout<>String[i];
return length;
}
void PrintStack(Stack &st, int top) //输出栈中的内容
{
4、 for(int i=0;i<=top;i++)
cout<5、分析过程**************************"<6、data[st.top],Terminal)!=-1) //栈顶为终结符
{
m=Is_Vt(st.data[st.top],Terminal);//获取分析表Table的第一个下标
t=st.top;
}
else //栈顶为非终结符,看top-1
{
m=Is_Vt(st.data[st.top-1],Terminal);//获取分析表Table的第一个下标
t=st.top-1;
}
if(Table[m][k]=='<' || Table[m][k]=='=') //栈顶符号的优先级小于等于输入符
7、号,压栈
{
PrintStack(st,st.top); //输出栈中内容
cout<8、lse if(Table[m][k]=='!') //两终结符的优先关系不确定
{
cout<9、获得分析表Table的列
}
else //t-1位置是一个非终结符
{
q=Is_Vt(st.data[t-2],Terminal);
t=t-2;
}
while(Table[q][m]!='<')
{
m=q;
if(Is_Vt(st.data[t-1],Terminal)!=-1) //终结符相邻符号也是终结符
{
q=Is_Vt(st.data[t-1],Terminal);//获得分析表Table的行
t=t-1; //获得分析表T
10、able的列
}
else //t-1位置是一个非终结符
{
q=Is_Vt(st.data[t-2],Terminal);
t=t-2;
}
}
PrintStack(st,st.top);
cout<11、
}
}
else
{
cout<