编译原理实验-递归子程序法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char stack[10]; //栈
int top;
char Vt[9]="i+-*/()"; //终结符号
int i;
void error(); //出错函数
void init(); //初始化预测分析表
int judge(char x,char a);
void analyse();
void main()
{
printf("%c",string[i]);
i++;
}
printf("\n");
analyse();
system("pasue");
}
void error()
{
printf("分析失败!\n");
system("pause");
ex百度文库t(0);
}
void init() //初始化预测分析表-已经产生式右部反转过来
return 0;
}
void E()
{
printf("E->TG \n");
T();
G();
}
void G()
{
if(lookhead=='+')
{
printf("G->+TG \n");
match('+');
T();
G();
}
else if(lookhead=='-')
{
printf("G->-TG \n");
top++;
stack[top]=string[0];
count++;
top++;
stack[top]='E';
step++;
printf("%d\t\t",step);
for(int i=0;i<=top;i++)
printf("%c",stack[i]);
printf("\t\t");
i=1;
while(string[i]!='\0')
char S,X,a; //S文法的开始符号,X当前栈顶符号的工作单元,a当前输入符号的工作单元
char string[10]; //存放输入的句型
int count=0;//计数器
int step=0; //记录步骤
char M[16][6]; //存放产生式
int record; //记录当前找到的M中产生式的下标
递归子程序法:
#include "stdio.h"
#include "stdlib.h"
void display();
char read(); //读取字符函数
void write();
char lookhead;
void E();
void T();
void G();
void S();
void F();
{
match('i');
}
else error();
}
void match(char ch)
{
lookhead=read();
}
void write()
{
char cha;
top=0;
printf("请输入待分析字符串:\n");
do
{
scanf("%c",&cha);
string[top]=cha;
{
printf("S->/FS \n");
match('/');
}
else
{
printf("S->ε \n");
}
}
void F()
{
if(lookhead=='(')
{
printf("F->(E) \n");
match('(');
E();
match(')');
}
else if(lookhead=='i')
{
init(); //初始化预测分析表
int i;
int mark1=0;
char ch;
top=-1;
printf("请输入要分析的字符串:\n");
string[0]='#';
i=1;
do
{
scanf("%c",&ch);
string[i]=ch;
i++;
}while(ch!='#');
printf("步骤\t\t分析栈\t\t剩余字符串\n");
top++;
}
while(cha!='#');
top=0;
}
char read()
{
char cha;
cha=string[top];
top++;
return cha;
}
void error()
{
puts(string);
printf("为非法字符串!\n");
system("pause");
exit(0);
strcpy(M[8],"S+$");
strcpy(M[9],"S*SF*");
strcpy(M[10],"S)$");
strcpy(M[11],"S#$");
strcpy(M[12],"S/SF/");
strcpy(M[13],"S-$");
strcpy(M[14],"Fii");
strcpy(M[15],"F()E(");
}
void display()
{
printf("班级:10级计本一班\n");
printf("学号:1004011026\n");
printf("姓名:王晓龙\n");
}
LL(1)分析方法:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
match('-');
T();
G();
}
else
{
printf("G->ε \n");
}
}
void T()
{
printf("T->FS \n");
F();
S();
}
void S()
{
if(lookhead=='*')
{
printf("s->*FS \n");
match('*');
F();
S();
}
else if(lookhead=='/')
}
int judge(char x,char b)
{
for(int i=0;i<16;i++)
{
if(M[i][0]==x && M[i][1]==b)
{
record=i;
return 1;
}
}
return 0;
{
strcpy(M[0],"EiGT");
strcpy(M[1],"E(GT");
strcpy(M[2],"G+GT+");
strcpy(M[3],"G)$");
strcpy(M[4],"G#$");
strcpy(M[5],"G-GT-");
strcpy(M[6],"TiSF");
strcpy(M[7],"T(SF");
void match(char ch);
void error(); //出错处理
char string[10];
int top;
int main()
{
display();
write();
lookhead=read();
E();
puts(string);
printf("为合法字符串!\n");
system("pause");
int top;
char Vt[9]="i+-*/()"; //终结符号
int i;
void error(); //出错函数
void init(); //初始化预测分析表
int judge(char x,char a);
void analyse();
void main()
{
printf("%c",string[i]);
i++;
}
printf("\n");
analyse();
system("pasue");
}
void error()
{
printf("分析失败!\n");
system("pause");
ex百度文库t(0);
}
void init() //初始化预测分析表-已经产生式右部反转过来
return 0;
}
void E()
{
printf("E->TG \n");
T();
G();
}
void G()
{
if(lookhead=='+')
{
printf("G->+TG \n");
match('+');
T();
G();
}
else if(lookhead=='-')
{
printf("G->-TG \n");
top++;
stack[top]=string[0];
count++;
top++;
stack[top]='E';
step++;
printf("%d\t\t",step);
for(int i=0;i<=top;i++)
printf("%c",stack[i]);
printf("\t\t");
i=1;
while(string[i]!='\0')
char S,X,a; //S文法的开始符号,X当前栈顶符号的工作单元,a当前输入符号的工作单元
char string[10]; //存放输入的句型
int count=0;//计数器
int step=0; //记录步骤
char M[16][6]; //存放产生式
int record; //记录当前找到的M中产生式的下标
递归子程序法:
#include "stdio.h"
#include "stdlib.h"
void display();
char read(); //读取字符函数
void write();
char lookhead;
void E();
void T();
void G();
void S();
void F();
{
match('i');
}
else error();
}
void match(char ch)
{
lookhead=read();
}
void write()
{
char cha;
top=0;
printf("请输入待分析字符串:\n");
do
{
scanf("%c",&cha);
string[top]=cha;
{
printf("S->/FS \n");
match('/');
}
else
{
printf("S->ε \n");
}
}
void F()
{
if(lookhead=='(')
{
printf("F->(E) \n");
match('(');
E();
match(')');
}
else if(lookhead=='i')
{
init(); //初始化预测分析表
int i;
int mark1=0;
char ch;
top=-1;
printf("请输入要分析的字符串:\n");
string[0]='#';
i=1;
do
{
scanf("%c",&ch);
string[i]=ch;
i++;
}while(ch!='#');
printf("步骤\t\t分析栈\t\t剩余字符串\n");
top++;
}
while(cha!='#');
top=0;
}
char read()
{
char cha;
cha=string[top];
top++;
return cha;
}
void error()
{
puts(string);
printf("为非法字符串!\n");
system("pause");
exit(0);
strcpy(M[8],"S+$");
strcpy(M[9],"S*SF*");
strcpy(M[10],"S)$");
strcpy(M[11],"S#$");
strcpy(M[12],"S/SF/");
strcpy(M[13],"S-$");
strcpy(M[14],"Fii");
strcpy(M[15],"F()E(");
}
void display()
{
printf("班级:10级计本一班\n");
printf("学号:1004011026\n");
printf("姓名:王晓龙\n");
}
LL(1)分析方法:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
match('-');
T();
G();
}
else
{
printf("G->ε \n");
}
}
void T()
{
printf("T->FS \n");
F();
S();
}
void S()
{
if(lookhead=='*')
{
printf("s->*FS \n");
match('*');
F();
S();
}
else if(lookhead=='/')
}
int judge(char x,char b)
{
for(int i=0;i<16;i++)
{
if(M[i][0]==x && M[i][1]==b)
{
record=i;
return 1;
}
}
return 0;
{
strcpy(M[0],"EiGT");
strcpy(M[1],"E(GT");
strcpy(M[2],"G+GT+");
strcpy(M[3],"G)$");
strcpy(M[4],"G#$");
strcpy(M[5],"G-GT-");
strcpy(M[6],"TiSF");
strcpy(M[7],"T(SF");
void match(char ch);
void error(); //出错处理
char string[10];
int top;
int main()
{
display();
write();
lookhead=read();
E();
puts(string);
printf("为合法字符串!\n");
system("pause");