编译原理实验之预测分析算法的设计与实现

不要被大段的代码吓到,其实问题很简单,只需照着书上的过程走即可。

实验要求:

输入文法及待分析的输入串,输出其预测分析过程及结果。(基本要求就是:所有字符都只有一个字符组成,不能出现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


鄙人不才,欢迎找错。

你可能感兴趣的:(编译原理)