您的位置:首页 > 其它

CSUFT 编译原理实验二LL(1)文法分析

2016-06-22 11:46 567 查看
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <vector>

using namespace std;

char A[20];/*分析栈*/
char B[20];/*剩余串*/
char v1[20]= {'i','+','*','(',')','#'}; /*终结符  */
char v2[20]= {'E','G','T','S','F'}; /*非终结符   */

int j=0,b=0,top=0,l;/*L为输入串长度 */
char x,ch;
int k=1;
int m,n;
int flag=0,finish=0;

typedef struct type/*产生式类型定义      */
{
char origin;/*大写字符  */
char array[5];/*产生式右边字符 */
int length;/*字符个数      */
} type;

type e,t,g,g1,s,s1,f,f1,cha;/*结构体变量  */
type C[10][10];/*预测分析表      */

void init()
{
e.origin='E';
strcpy(e.array,"TG");
t.origin='T';
strcpy(t.array,"FS");
g.origin='G';
strcpy(g.array,"+TG");
g1.origin='G';
g1.array[0]='^';
s.origin='S';
strcpy(s.array,"*FS");
s1.origin='S';
s1.array[0]='^';
f.origin='F';
strcpy(f.array,"(E)");
f1.origin='F';
f1.array[0]='i';

for(int m=0; m<=4; m++) /*初始化分析表*/
for(int n=0; n<=5; n++)
C[m]
.origin='N';/*全部赋为空*/
/*填充分析表*/
C[0][0]=e;
C[0][3]=e;
C[1][1]=g;
C[1][4]=g1;
C[1][5]=g1;
C[2][0]=t;
C[2][3]=t;
C[3][1]=s1;
C[3][2]=s;
C[3][4]=C[3][5]=s1;
C[4][0]=f1;
C[4][3]=f;
}

void print()/*输出分析栈  */
{
int a;/*指针*/
for(a=0; a<=top+1; a++)
printf("%c",A[a]);
printf("\t\t");
}

void print1()/*输出剩余串*/
{
int j;
for(j=0; j<b; j++) /*输出对齐符*/
printf(" ");
for(j=b; j<=l; j++)
printf("%c",B[j]);
printf("\t\t\t");
}
int main()
{
init();
//测试样例反例
//i+i(i+i)#
//i()#
//正确样例
//i+i*i#

do/*读入分析串*/
{
scanf("%c",&ch);
if ((ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#'))
{
printf("输入串中有非法字符\n");
exit(1);
}
B[j]=ch;
j++;
}while(ch!='#');
l=j;/*分析串长度*/
ch=B[0];/*当前分析字符*/
A[top]='#';
A[++top]='E';/*'#','E'进栈*/
printf("步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式 \n");

do{
flag = 0;
if(finish) break;
x=A[top--];/*x为当前栈顶字符*/
printf("%d",k++);
printf("\t\t");

for( j=0; j<=5; j++) /*判断是否为终结符*/
{
if(x==v1[j])
{
flag=1;
break;
}
}
if(flag==1)/*如果是终结符*/
{
if(x=='#')
{
finish=1;/*结束标记*/
printf("acc!\n");/*接受 */
getchar();
getchar();
exit(1);
}
if(x==ch)
{
print();
print1();
printf("%c匹配\n",ch);
ch=B[++b];/*下一个输入字符*/
flag=0;/*恢复标记*/
}
/*else //出错处理
{
print();
print1();
printf("%c出错\n",ch);//输出出错终结符
exit(1);
}*/
}
else/*非终结符处理*/
{
for(j=0; j<=4; j++)
if(x==v2[j])
{
m=j;/*行号*/
break;
}
for(j=0; j<=5; j++)
if(ch==v1[j])
{
n=j;/*列号*/
break;
}
cha=C[m]
;
if(cha.origin!='N')/*判断是否为空*/
{
print();
print1();
printf("%c->",cha.origin);/*输出产生式*/
int len = strlen(cha.array); //长度是array的长度
for(j=0; j<len; j++)
printf("%c",cha.array[j]);
printf("\n");
for(j=(len-1); j>=0; j--) /*产生式逆序入栈*/
A[++top]=cha.array[j];
if(A[top]=='^')/*为空则不进栈*/
top--;
}
else //出错处理 调整顺序
{
print();
print1();
printf("%c出错\n",ch);//输出出错终结符
exit(1);
}

}

}while(top!=-1); //当分析栈不为空

return 0;
}


View Code
送人玫瑰手留余香。。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: