资源简介
对于给定的文法,根据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(“
相关资源
- 北邮-编译原理-词法分析
- C语言编译器的设计与实现.doc
- c++curllib传输json使用
- 现代编译原理-C语言描述
- Delphi反编译工具
- VC经典教程等chm格式学习资料包
- tiny+编译器C++实现
- 缩短循环码(2616)编译码程序-C语言
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 一个C语言编译器源码
- 可以将C语言转变为汇编的编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- LL1语义分析的C语言子集编译器
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- plo编译器 c语言 含测试 以及实验报告
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- VC++2010(VC++最新版!)
- SpiderMonkey1.61.7 编译文件全部libdllh文件
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- BCH编译码c语言实现
- picc8.05编译器
- ldpc编译码c代码
- 计算机二级VC++2010学习版
- 山东大学编译原理实验源代码c++版
- SNL语言编译器GUI VC++ 2008版 MFC实现可
评论
共有 条评论