不要被大段的代码吓到,其实问题很简单,只需照着书上的过程走即可。
实验要求:
输入文法及待分析的输入串,输出其预测分析过程及结果。(基本要求就是:所有字符都只有一个字符组成,不能出现A*等字符,你可自行修改自己的文法后在用下面的代码)
注明:代码分了多个写,主函数是1.cpp代码如下(后期我会再发个链接过来可直接看到源文件,对不太熟悉VS工具的比较有帮助),想看中间结果的话可以将注释解开即可:
#include"head.h"
#include"apart_from.h"
#include"first.h"
#include"follw.h"
#include"table.h"
#include"judge.h"
int main(){
int i=0,j;
while((scanf("%s",form[i].formula),form[i].formula[0])!='#'){
i++;
}
sum = i;
apart();
First();
Follow();
printf("非终结符:\n");
printf("%s\n",ter_symbol);
printf("终结符:\n");
printf("%s\n",non_ter);
/*
printf("first集:\n");
for(j=0;j
apart_from.h的代码:
void apart(){
int i,len,k=0,j,l,p;
for(i=0;i
head.h的代码:
#include
#include
typedef struct {
char formula[200];//表达式
}grammerElement;
grammerElement form[200]; //原始文法的产生式集
int sum;
char ter_symbol[200];//非终结符号
char non_ter[200];//终结符号
char inter_symbol[400];//输入符号
char first_set[100][100];//各产生式右部的FIRST集
char follow_set[100][100];//各产生式左部的FOLLOW集
int M[200][200];//分析表
//判断是非终结符
int get_ter(char a){
for(int i=0;i
first.h的代码:
//求一个非终结符的first集
int getFirst(char a,int col){
int i,j,k=1,l,p;
for(i=0;i
follow.h的代码:
int getFollow(char a,int col){
int i,j,len,k=1,p,l,flag;
if(col==0)
k=2;
for(i=0;i1)
follow_set[col][0]='1';
follow_set[col][k]='\0';
return 0;
}
void Follow(){
int i;
for(i=0;i
judge.h的代码:
int top;
char stack[200];
int x;
void Judge(){
stack[0]='#';
stack[1]=form[0].formula[0];
int flag=1,step=0;
int i,j,l;
char print[100];
top=1;
x=0;//printf("---- ------ ------\n");
printf(" %d ",step++);
for(l=0;l<=top;l++)
printf("%c",stack[l]);
for(l=0;l<=22-top+x;l++)
printf(" ");
for(l=x;l=0){
if(stack[top]==inter_symbol[x]){
x++;//终结符匹配上
top--;
if(step<10)
printf(" %d ",step++);
else
printf(" %d ",step++);
for(l=0;l<=top;l++)
printf("%c",stack[l]);
for(l=0;l<=22-top+x;l++)
printf(" ");
for(l=x;l=0){//非终结符
if(form[M[col][row]].formula[3]=='$'){
top--;
}
else
{
for(i=strlen(form[M[col][row]].formula)-1;i>=3;i--){
stack[top++]=form[M[col][row]].formula[i];
}
top--;
}
if(step<10)
printf(" %d ",step++);
else
printf(" %d ",step++);
for(l=0;l<=top;l++)
printf("%c",stack[l]);
for(l=0;l<=22-top+x;l++)
printf(" ");
for(l=x;l
table.h的代码:
void getTable(){//ter_symbol[200];//非终结符号
// non_ter[200];//终结符号
int i,j,k,col,row,flag=0;
for(i=0;i=0){//printf("%d %d 1\n",row,i);
col=get_ter(form[i].formula[0]);
M[col][row]=i;
}//右部是终结符
else if((row=get_non(form[i].formula[3]))==-1){//非终结符和空
//if()
col=get_ter(form[i].formula[0]);//左部是行坐标
k=get_ter(form[i].formula[3]);//右部非终结符的下标
if(k>=0){
for(j=1;j