www.pudn.com > bianyi(LL1).rar > LL1.cpp
#include"iostream.h"
#include"string.h"
#include "iomanip.h"
#include "stdlib.h"
struct stack
{
int top;
char s[10];
}*sign;
char *M[5][6]={
{"TP","$","$","TP","$","$"},
{"$","+TP","$","$","e","e"},
{"FQ","$","$","FQ","$","$"},
{"$","e","*FQ","$","e","e"},
{"i","$","$","(E)","$","$"}};
int index(char m)
{
int ID;
if((m=='E')||(m=='i')) ID=0;
else if((m=='P')||(m=='+')) ID=1;
else if((m=='T')||(m=='*')) ID=2;
else if((m=='Q')||(m=='(')) ID=3;
else if((m=='F')||(m==')')) ID=4;
else if(m=='#') ID=5;
else ID=6;
return ID;
}
void main()
{
char instr[15],x,a,*current,left,*right;int i=0,iA,ia,len,top;
bool flag=true;
cout<<"参照文法为:\n"<<"E→TE'\n"<<"E'→+TE'|ε\n"<<"T→FT'\n"<<"T'→*FT'|ε\n"<<"F→(E)|i\n";
cout<<"为编成方便作改写:E'以P、T'以Q 代替."<>instr[i++];
}
while(instr[i-1]!='#');
instr[i]='\0';
sign=new stack;
sign->s[0]='#';
sign->s[1]='E';
sign->s[2]='\0';
sign->top=1;
current=instr;
a=*current; //a为ip所指向的符号;
cout<<"步骤"<s<s[sign->top]; //让X等于栈顶符号
if(x=='#') //if X 是终结符号或# then
{
if(x==a) //If X=a then 把X从栈顶弹出并使ip指向下一个输入符号
flag=false;
else
{
cout<<"此句子不符合该文法!";
break;
}
}
else if((x=='i')||(x=='+')||(x=='*')||(x=='(')||(x==')')) //else X 是终结符号
{
if(x==a)
{
sign->s[sign->top]='\0';
sign->top--; //从栈中弹出X
a=*(++current);
cout<s<s[sign->top]='\0';
sign->top-=1; //从栈中弹出X
right="ε";
}
else if((len==1)&&(M[iA][ia][0]=='$'))
{
cout<<"此句子不符合该文法!";
break;
}
else
{
top=sign->top;
for(int j=len-1;j>=0;j--)
sign->s[top++]=M[iA][ia][j]; //压入栈
sign->s[top]='\0';
sign->top=top-1;
}
cout.setf(ios::left);
cout<s<