内容摘要
第1章 绪论
1.1、课程设计目的
1.2、课程设计意义
1.3、课程设计要求
1.4、课程设计内容
1.4.1、题目
1.4.2、内容
1.4.3、具体要求
1.4.4、程序设计提示
1.4.5、测试数据
1.4.6、程序扩展要求
第2章 程序总体设计
第3章 程序详细设计与实现
3.1、词法分析
3.2、语法分析
3.3、语义分析
3.4、程序实现结果图
图3-4 语义分析结果图
图3-5二元式
图3-6符号表
图3-7四元式
附录
#include
#include
using namespace std;
#define maxsize 50
#define max 30
ifstream infile;
char ch;
int m,n,kk=0,addr=0,t=1;
string get1;
string in[maxsize];
string ins[maxsize];
string s[4];
int count=0;
string v1[8]={"int","float",";",",","id","#","D","
string v2[13]={"#","id","=","num",";","+","*","(",
string E="",E1="",T="",T1="",F="";
int analysis_table1[10][8]={3,4,0,0,0,0,2,1,
0,0,0,0,0,100,0,0,
0,0,5,6,0,0,0,0,
0,0,0,0,7,0,0,0,
0,0,0,0,8,0,0,0,
0,0,0,0,0,-1,0,0,
0,0,0,0,9,0,0,0,
0,0,-2,-2,0,0,0,0,
0,0,-3,-3,0,0,0,0,
0,0,-4,-4,0,0,0,0};
int analysis_table2[17][13]={0,2,0,0,0,0,0,0,0,0,
100,0,0,0,0,0,0,0,0,
0,0,3,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,4,5,
0,0,0,0,10,11,0,0,0,0,0,0,0,
0,0,0,0,-3,-3,12,0,-3,0,0,0,0,
0,0,0,0,-5,-5,-5,0,-5,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,13,5,
0,0,0,0,-8,-8,-8,0,-8,0,0,0,0,
0,0,0,0,-7,-7,-7,0,-7,0,0,0,0,
-1,0,0,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,0,14,
0,9,0,8,0,0,0,7,0,15,0,0,0,
0,0,0,0,0,11,0,0,16,0,0,0,0,
0,0,0,0,-2,-2,12,0,-2,0,0,0,0,
0,0,0,0,-4,-4,-4,0,-4,0,0,0,0,
0,0,0,0,-6,-6,-6,0,-6,0,0,0,0};
typedef struct //状态栈
{
int data[max];
int top;
}seqstack1;
typedef struct //符号栈
{
string data[max];
int top;
}seqstack2;
struct reserveedword//保留字表结构
{
string word;
char value;
}reserveedword1[maxsize];
struct identifer//标识符表结构
{
char identiname[15];
char identitype[15];
int address;
}identifer1[maxsize];
struct constant//常量表结构
{
string constantname;
string value;
int constantaddress;
}constant1[maxsize];
void Initscanner();
void Lexscan();
void Isalpha(char);
void Isnumber(char);
void Isother(char);
void Output(int ,int ,char *);
void Scanner();
void change(char c[],string str)
{
int len=str.length();
for(int num=0;num
c[num]=str[num];
c[len]='\0';
}
seqstack1 *init_seqstack1()
{
seqstack1 *s;
s=new seqstack1;
if(!s)
{
cout<<"空间不足!"<
return NULL;
}
else
{
s->top=-1;
return s;
}
}
int empty_seq1(seqstack1 *s)
{
if(s->top==-1)
return 1;
else
return 0;
}
int push_seq1(seqstack1 *s,int x)
{
if(s->top==max-1)
return 0;
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
}
int pop_seq1(seqstack1 *s,int *x)
{
if(empty_seq1(s))
return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}
void top_seq1(seqstack1 *s,int &e)
{
if(empty_seq1(s))
cout<<"占空!";
else
e=s->data[s->top];
}
seqstack2 *init_seqstack2()
{
seqstack2 *s;
s=new seqstack2;
if(!s)
{
cout<<"空间不足!"<
return NULL;
}
else
{
s->top=-1;
return s;
}
}
int empty_seq2(seqstack2 *s)
{
if(s->top==-1)
return 1;
else
return 0;
}
int push_seq2(seqstack2 *s,string x)
{
if(s->top==max-1)
return 0;
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
}
int pop_seq2(seqstack2 *s,string *x)
{
if(empty_seq2(s))
return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}
void out_seq1(seqstack1 *s)
{
for(int i=0;i<=s->top;i++)
printf("%d",s->data[i]);
}
void out_seq2(seqstack2 *s)
{
char ch[15];
for(int i=0;i<=s->top;i++)
{
change(ch,s->data[i]);
printf("%s",ch);
}
}
seqstack1 *s1=init_seqstack1();
seqstack2 *s2=init_seqstack2();
seqstack2 *s3=init_seqstack2();
void pop(int n)
{
int m;
string s;
for(int i=0;i
{
pop_seq1(s1,&m);
pop_seq2(s2,&s);
pop_seq2(s3,&s);
}
}
int screamp(char a[15],string b)
{
int i=0,j=0;
while(a[i]!='\0'&&b[i]!='\0')
{
if(a[i]==b[i])
{
i++;
j++;
}
else
return 0;
}
if(a[i]==b[i])
return 1;
else
return 0;
}
int screamp1(string a,string b)
{
int i=0,j=0;
while(a[i]!='\0'&&b[i]!='\0')
{
if(a[i]==b[i])
{
i++;
j++;
}
else
return 0;
}
if(a[i]==b[i])
return 1;
else
return 0;
}
void clear(seqstack1 *s1,seqstack2 *s2,seqstack2 *
{
int m;
string s;
while(!empty_seq1(s1))
{
pop_seq1(s1,&m);
pop_seq2(s2,&s);
pop_seq2(s3,&s);
}
}
void char_Table()
{
char str1[15],str2[15];
cout<<"\n生成的标识符表为:";
cout<<"\n\tname\ttype\tvalue\taddress";
for(int i=0;i
printf("\n%d\t%s\t%s",i,identifer1[i].identina
cout<<"\n生成的常数表为:";
cout<<"\n\tvalue\ttype\tname\taddress";
for(int j=0;j
{
change(str1,constant1[j].constantname);
change(str2,constant1[j].value);
printf("\n%d\t%s\t%s",j,str1,str2);
}
}
int judge(string m[],int i,string x)
{
for(int j=0;j
if(screamp1(x,m[j]))
return 1;
return 0;
}
int address(string m[],int i,string x)
{
for(int j=0;j
if(screamp1(x,m[j]))
return j;
}
void print(string s[])
{
cout<<"\n产生的四元式为"<
char ch[max];
for(int i=0;i
{
change(ch,s[i]);
printf("%s",ch);
cout<
}
cout<
}
void emit(string str1,string str2,string str3,stri
{
s[count]+="(";s[count]+=str1;s[count]+=",";
s[count]+=str2;s[count]+=",";s[count]+=str3;
s[count]+=",";s[count]+=str4;s[count]+=")";
count++;
}
string newtemp()
{
char s[2];
s[0]='T';
s[1]=t;
s[2]='\0';
t++;
return s;
}
void action1(int i,string s)
{
int pos,j;
j=address(v1,8,s);
pos=analysis_table1[i][j];
char str[15];
change(str,s);
out_seq1(s1);
printf("\t\t");out_seq2(s2);printf("\t\t");out_se
if(pos==100)
{
cout<<"分析成功!"<
cout<<"**************************************
}
else
printf("action[%d,%s]=S%d状态%d入栈\n",i,str,pos,po
push_seq1(s1,pos);
push_seq2(s2,s);
push_seq2(s3,"_");
get1=in[addr];
addr++;
}
void goto1(int i,string s)
{
int pos,j;
if(judge(v1,8,s))
j=address(v1,8,s);
pos=analysis_table1[i][j];
char str[15];
change(str,s);
printf("goto[%d,%s]=%d\n",i,str,pos);
push_seq1(s1,pos);
push_seq2(s2,s);
}
void slr1()
{
clear(s1,s2,s3);
char str1[15];
push_seq1(s1,0);
push_seq2(s2,"#");
push_seq2(s3,"_");
get1=in[addr];
addr++;
int top,j;
while(1)
{
j=address(v1,8,get1);
top_seq1(s1,top);
if(top==100)
{
addr--;
return;
}
j=analysis_table1[top][j];
if(j<0)
{
if(j==-1)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(2);
top_seq1(s1,top);
goto1(top,"S");
push_seq2(s3,"_");
}
else if(j==-2)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
change(str1,"int");
for(int k=0;k<15;k++)
identifer1[kk].identitype[k]=str
kk++;
pop(2);
top_seq1(s1,top);
goto1(top,"D");
push_seq2(s3,"_");
}
else if(j==-3)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
change(str1,"float");
for(int k=0;k<15;k++)
identifer1[kk].identitype[k]=st
kk++;
pop(2);
top_seq1(s1,top);
goto1(top,"D");
push_seq2(s3,"_");
}
else if(j==-4)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
for(int k=0;k<15;k++)
identifer1[kk].identitype[k]=id
kk++;
pop(3);
top_seq1(s1,top);
goto1(top,"D");
push_seq2(s3,"_");
}
}
else if(j>0)
action1(top,get1);
}
}
void action2(int i,string s)
{
int pos,j;
if(judge(v2,13,s))
j=address(v2,13,s);
pos=analysis_table2[i][j];
char str[15];
change(str,s);
out_seq1(s1);printf("\t\t");out_seq2(s2);printf("
if(pos==100)
{
cout<<"分析成功!"<
cout<<"*****************************************
}
else
printf("action[%d,%s]=S%d状态%d入栈\n",i,str,pos,
push_seq1(s1,pos);
push_seq2(s2,s);
push_seq2(s3,"_");
get1=in[addr];
addr++;
}
void goto2(int i,string s)
{
int pos,j;
if(judge(v2,13,s))
j=address(v2,13,s);
pos=analysis_table2[i][j];
char str[15];
change(str,s);
printf("goto[%d,%s]=%d\n",i,str,pos);
push_seq1(s1,pos);
push_seq2(s2,s);
}
void slr2()
{
t='1';
clear(s1,s2,s3);
push_seq1(s1,0);
push_seq2(s2,"#");
push_seq2(s3,"_");
get1=in[addr];
addr++;
string p[10];int num=0;
p[num]=ins[addr-1];num++;
int top,j;
char str1[15];
while(1)
{
j=address(v2,13,get1);
top_seq1(s1,top);
if(top==100)
{
addr--;
return;
}
j=analysis_table2[top][j];
if(j>0)
action2(top,get1);
else if(j<0)
{
if(j==-1)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(4);
top_seq1(s1,top);
goto2(top,"A");
for(int i=0;i
if((screamp(identifer1[i].identiname,p[0]))
{
change(str1,identifer1[i].identiname);
emit("=",E,"_",str1);
push_seq2(s3,str1);
}
}
else if(j==-2)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(3);
top_seq1(s1,top);
goto2(top,"E");
E1=E;
E=newtemp();
emit("+",E1,T,E);
push_seq2(s3,E);
}
else if(j==-3)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(1);
top_seq1(s1,top);
goto2(top,"E");
E=T;
push_seq2(s3,T);
}
else if(j==-4)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(3);
top_seq1(s1,top);
goto2(top,"T");
T1=T;
T=newtemp();
emit("*",T1,F,T);
push_seq2(s3,T);
}
else if(j==-5)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(1);
top_seq1(s1,top);
goto2(top,"T");
T=F;
push_seq2(s3,F);
}
else if(j==-6)
{
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(3);
top_seq1(s1,top);
goto2(top,"F");
F=E;
push_seq2(s3,E);
}
else if(j==-7)
{
p[num]=ins[addr-2];num++;
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(1);
top_seq1(s1,top);
goto2(top,"F");
for(int i=0;i
if((screamp(identifer1[i].identiname,p[num-
{
change(str1,identifer1[i].identiname);
F=str1;
push_seq2(s3,str1);
}
}
else if(j==-8)
{
p[num]=ins[addr-2];num++;
out_seq1(s1);printf("\t\t");out_seq2(s2);pri
pop(1);
top_seq1(s1,top);
goto2(top,"F");
for(int i=0;i
if((screamp1(constant1[i].constantname,p[nu
{
F=constant1[i].constantname;
push_seq2(s3,F);
}
}
}
}
}
void printslr1()
{
cout<<"\n****************************语法语义分析情况**
cout<<"状态栈\t\t符号栈\t\t语义栈\t\t动作说明"<
}
void Initscanner()
{
reserveedword1[1].word="int";
reserveedword1[2].word="char";
reserveedword1[3].word="float";
reserveedword1[4].word="void";
reserveedword1[5].word="const";
reserveedword1[6].word="for";
reserveedword1[7].word="if";
reserveedword1[8].word="else";
reserveedword1[9].word="then";
reserveedword1[10].word="while";
reserveedword1[11].word="switch";
reserveedword1[12].word="break";
reserveedword1[13].word="begin";
reserveedword1[14].word="end";
}
void Scanner()
{
cout<<"生成的二元式为:"<
while(ch!='#')
{
Lexscan();
}
cout<
}
void Lexscan()
{
infile.get(ch);
if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))
Isalpha(ch);
else if((ch>='0')&&(ch<='9'))
Isnumber(ch);
else
Isother(ch);
}
void Isalpha(char s)
{
char keep[15];
int i=0;
keep[i]=s;
i++;
while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<=
{
infile.get(ch);
keep[i]=ch;
i++;
}
keep[i-1]='\0';
for(int k=1;k<=14;k++)
{
if(screamp(keep,reserveedword1[k].word))
{
Output(1,i-1,keep);
in[addr]=keep;ins[addr]=keep;
addr++;
return;
}
}
if(m==0)
{
for(k=0;k
identifer1[m].identiname[k]=keep[k];
Output(2,0,keep);
in[addr]="id";ins[addr]=keep;
addr++;
m++;
}
else
{
for(int j=0;j
{
if(screamp(keep,identifer1[j].identiname))
{
Output(2,j,keep);
in[addr]="id";ins[addr]=keep;
addr++;
infile.seekg(-1,ios::cur);
return;
}
}
for(k=0;k
identifer1[m].identiname[k]=keep[k];
Output(2,m,keep);
in[addr]="id";ins[addr]=keep;
addr++;
m++;
}
if(ch=='#')
return;
else
infile.seekg(-1,ios::cur);
}
void Isnumber(char s)
{
char integer[15];
int i=0;
integer[i]=s;
i++;
while((ch>='0')&&(ch<='9'))
{
infile.get(ch);
integer[i]=ch;
i++;
}
integer[i-1]='\0';
if(n==0)
{
constant1[n].constantname=integer;
Output(3,0,integer);
in[addr]="num";ins[addr]=integer;
addr++;
n++;
}
else
{
for(int j=0;j
{
if(screamp(integer,constant1[n].constantname)
{
Output(3,j,integer);
in[addr]="num";ins[addr]=integer;
addr++;
return;
}
}
constant1[n].constantname=integer;
Output(3,n,integer);
in[addr]="num";ins[addr]=integer;
addr++;
n++;
}
if(ch=='#')
return;
else
infile.seekg(-1,ios::cur);
}
void Isother(char s)
{
char temp[15];
int i=0;
temp[i]=s;
i++;
switch(temp[0])
{
case '+':
{
cout<<"(+,-)\n";
in[addr]="+";
ins[addr]="+";
addr++;
break;
}
case '-':
{
cout<<"(-,-)\n";
in[addr]="-";
ins[addr]="-";
addr++;
break;
}
case '*':
{
cout<<"(*,-)\n";
in[addr]="*";
ins[addr]="*";
addr++;
break;
}
case '(':
{
cout<<"((,-)\n";
in[addr]="(";
ins[addr]="(";
addr++;
break;
}
case ')':
{
cout<<"(),-)\n";
in[addr]=")";
ins[addr]=")";
addr++;
break;
}
case '=':
{
cout<<"(=,-)\n";
in[addr]="=";
ins[addr]="=";
addr++;
break;
}
case ';':
{
cout<<"(;,-)\n";
in[addr]=";";
ins[addr]=";";
addr++;
in[addr]="#";
ins[addr]="#";
addr++;
break;
}
case ',':
{
cout<<"(,,-)\n";
in[addr]=",";
ins[addr]=",";
addr++;
break;
}
}
}
void Output(int i,int j,char ss[15])
{
switch(i)
{
case 1:
{
cout<<"(";
for(int k=0;k
{cout<
cout<<","<<"-"<<")\n";
break;
}
case 2:
{
cout<<"(id,"<
break;
}
case 3:
{
cout<<"(num,"<
break;
}
}
}
void main()
{
infile.open("input.txt",ios::in);
if(!infile)
{
cerr<<"读取的文件打开失败!"<
exit(1);
}
Initscanner();
Scanner();
infile.close();
printslr1();
addr=0;
while(!screamp1(in[addr],""))
{
int j=0;
for(int i=1;i<=14;i++)
if(screamp1(in[addr], reserveedword1[i].word)
j=100;
if(j==100)
slr1();
else
slr2();
}
char_Table();
print(s);
}