• 大小: 6KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-09-06
  • 语言: C/C++
  • 标签: 编译  

资源简介

对于给定的文法,根据first集以及follow集构造LL(1)分析表。 输入语句,进行分析

资源截图

代码片段和文件信息

//语法分析程序
#include 
#include 
#include 
int find_first(int achar b);//判断终结符是否存在于first集中
int find_follow(int achar b);//判断终结符是否存在于follow集中
void construct();//创建预测分析表
void print_table();//打印预测分析表
char gra[12][20] = {“ ““E->TE‘“ “E‘->+TE‘“ “E‘->-TE‘““E‘->^““T->FT‘“
“T‘->*FT‘““T‘->/FT‘““T‘->^““F->id““F->(E)““F->num“};
char gra_p[12][10] = {“ ““TA“ “+TA“ “-TA““^““FB“
“*FB““/FB““^““i““(E)““n“};//构造预测分析程序专用,其中每项与gra数组对应
char *first_right[12] = {“ ““i(n\0““+\0““-\0““^\0““i(n\0““*\0““/\0““^\0““i\0““(\0““n\0“};
char first_left[5][20] = {“i(n““+-^““i(n““*/^““i(n“};
char *follow[5] = {“)$\0““)$\0““+-)$\0““+-)$\0““+-*/)$\0“};
char ter[9] = {‘+‘‘-‘‘*‘‘/‘‘i‘‘n‘‘(‘‘)‘‘$‘};
char ter_p[9][4] = {“+““-““*““/““id““num““(““)““$“};//打印专用
char not_ter[5][3] = {“E““E‘““T““T‘““F“};

int M[5][9] = {NULL};
//构造分析表
void construct()

int i = 1;
int j = 0;
int k = 0;
for(j= 0;j<9;j++)//构造E的分析表
{
if(find_first(1ter[j]))
{
M[0][j] = 1;
}
}
if(find_first(i‘^‘))
{
for(k = 0;k<9;k++)
{
if(find_follow(1ter[k]))
M[0][k] = i;
}
}
for(i = 2;i < 5;i++)//构造E‘的分析表
{
for(j = 0;j<9;j++)
{
if(find_first(iter[j]))
{
M[1][j] = i;
}
}
if(find_first(i‘^‘))
{
for(k = 0;k<9;k++)
{
if(find_follow(1ter[k]))
M[1][k] = i;
}
}
}
i = 5;
for(j = 0;j<9;j++)//构造T的分析表
{
if(find_first(iter[j]))
{
M[2][j] = i;
}

}
if(find_first(i‘^‘))
{
for(k = 0;k<9;k++)
{
if(find_follow(2ter[k]))
M[2][k] = i;
}
}
for(i = 6;i<9;i++)//构造T‘的分析表
{
for(j = 0;j<9;j++)
{
if(find_first(iter[j]))
{
M[3][j] = i;
}
}
if(find_first(i‘^‘))
{
for(k = 0;k<9;k++)
{
if(find_follow(3ter[k]))
M[3][k] = i;
}
}
}
for(i = 9;i<12;i++)//构造F的分析表
{
for(j = 0;j<9;j++)
{
if(find_first(iter[j]))
{
M[4][j] = i;
}
}
if(find_first(i‘^‘))
{
for(k = 0;k<9;k++)
{
if(find_follow(4ter[k]))
M[4][k] = i;
}
}
}
}
//查找字符是否存在于first集中,存在,返回1,不存在,返回0
int find_first(int ichar b)
{
int j = 0;
while(first_right[i][j]!=‘\0‘)
{
if(first_right[i][j]==b)
{
return 1;
}
else
{
j++;
}
}
if(first_right[i][j]==‘\0‘)
return 0;
}

//查找字符是否存在于follow集中,存在,返回1,不存在,返回0
int find_follow(int ichar b)
{
int j = 0;
while(follow[i][j]!=‘\0‘)
{
if(follow[i][j]==b)
{
return 1;
}
else
{
j++;
}
}
if(follow[i][j]==‘\0‘)
return 0;
}


//打印预测分析表
void print_table()
{
printf(“构造此文法的预测分析表如下:\n “);
for(int i = 0;i<9;i++)
{
printf(“%10s“ter_p[i]);
//printf(“\t“);
}
printf(“\n“);
for(int i = 0;i<5;i++)
{
printf(“%s “not_ter[i]);
for(int j = 0;j<9;j++)
{
if(M[i][j]!=NULL)
{
printf(“%10s“gra[M[i][j]]);
}
else
{
printf(“    

评论

共有 条评论