📄 ll(1)文法.txt
字号:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<string.h>
#include<stdio.h>
#define Q 20
#define N 7
#define M 6
#define P 4
int table[M][N]; //表table和表content合起来为预测分析表
char content[N][P]; //存放预测分析表中用到的表达式,如'->TE'等
void inittable() //初始化table表
{
for(int i=1;i<M;i++)
for(int j=1;j<N;j++)
table[i][j]=-1; //出错位均为-1
table[1][1]=table[1][4]=0;
table[2][2]=1;
table[3][1]=table[3][4]=2;
table[4][3]=3;
table[5][4]=4;
table[5][1]=5;
table[2][5]=table[2][6]=table[4][2]=table[4][5]=table[4][6]=6;
}
void initcontent() //初始化产生式表
{
for(int i=0;i<N;i++)
for(int j=0;j<P;j++)
content[i][j]='\0';
content[0][0]='T';content[0][1]='S';content[0][2]='\0'; //S代替E'
content[1][0]='+';content[1][1]='T';content[1][2]='S';content[1][3]='\0';
content[2][0]='F';content[2][1]='Y';content[2][2]='\0'; // Y代替T'
content[3][0]='*';content[3][1]='F';content[3][2]='Y';content[3][3]='\0';
content[4][0]='(';content[4][1]='E';content[4][2]=')';content[4][3]='\0';
content[5][0]='i';content[5][1]='\0';
content[6][0]='$';content[6][1]='\0'; //$代表空串
}
int row(char ch) //判断字符所处的行号
{
switch(ch){
case 'E':return 1;
case 'S':return 2;
case 'T':return 3;
case 'Y':return 4;
case 'F':return 5;
default :return 0;
}
}
int col(char ch) //判断字符所处的列号
{
switch(ch){
case 'i':return 1;
case '+':return 2;
case '*':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
default :return 0;
}
}
void analy(char *s) //分析
{
int p=0,cx=1,q;
int i,j;
char stack[M]; //分析栈
inittable(); //初始化
initcontent(); //初始化
stack[p++]='#';stack[p++]='E'; //初始化堆栈
while(s)
{
j=col(*s);
i=row(stack[--p]);
if(j==0) //表明预测分析表中的列项中没有该非终结符
{
cout<<cx<<"\t";
int k=0;
while(k<=p)
cout<<stack[k++];
cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不是该文法的终结符!"<<endl;
exit(1);
}
if(i==0)
{ //说明是终结符
if(stack[p]==*s) //与栈顶元素匹配
{
cout<<cx++<<"\t";
int k=0;
while(k<=p)
cout<<stack[k++];
if(*s=='#') //是结束的符号
{
cout<<"\t\t"<<s<<setw(25-strlen(s))<<"接受!"<<endl;
exit(0);
}
cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"匹配!"<<endl;
s++; //输入串自减
}
else {
cout<<cx<<"\t"; //说明是终结符,但不是该文法的终结符
int k=0;
while(k<=p)
cout<<stack[k++];
cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不匹配!"<<endl;
exit(1);
}
}
else if(table[i][j]==-1) //分析表中没有对照的项,表明出错
{
cout<<cx<<"\t";
int k=0;
while(k<=p)
cout<<stack[k++];
cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不匹配!"<<endl;
exit(1);
}
else{q=table[i][j];
cout<<cx++<<"\t";
int k=0;
while(k<=p)
cout<<stack[k++];
cout<<"\t\t"<<s<<setw(25-strlen(s))<<stack[p]<<"->";
k=0;
while(content[q][k]!='\0') //将表达式输出
{
cout<<content[q][k];
k++;
}
cout<<'\n';
k--;
if(content[q][k]!='$') //将产生式入栈
for(;k>=0;k--)
stack[p++]=content[q][k];
}
}
}
void main()
{
int flag=1;
while(flag)
{
char *str,c;
cout<<"......实验二:LL(1)分析文法......\n给定的LL(1)文法为:\nE->E+T|T\nT->T*F|F\nF->i|(E)\n";
cout<<"请输入分析串:\n";
str=new char[Q];
cin>>str;
cout<<"步骤\t分析栈\t\t剩余输入串\t\t所用产生式\n";
analy(str);
cout<<"继续?(y/n)\n"<<endl;
c=getchar();
if((c=='y')||(c=='Y'))
flag=1;
else
flag=0;
}
cout<<"其中S代表次E',Y代表T'."<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -