资源简介
编写一个算符优先分析程序,能实现以下功能:
1. 输入文法,判断是否为算符文法。
2. 构造并输出文法的每个非终结符的FIRSTVT和LASTVT。
3. 构造并输出算符优先分析表,判断是否为算符优先文法,如果不是提示无法进行分析。
4. 输入任意一个输入串,可得到成功的分析或错误提示,输出其分析过程或打印语法分析树。
代码片段和文件信息
#include
#include
int k;
char a;
int j;
char q;
int r;//输入的文法规则数
int r1;//转化后文法的个数
char st[10][30];//文法二维数组,其中一个巨型的表示为st[i]
char data[20][20];//优先分析表
char s[100];//符号栈
char lable[20];//除大写字母、->和|之外的否有字符规定为非中介符字符串或者集合
char input[100];//输入待分析的串
char string[20][10];//不含->符号的文法
//[i][0]中存放的的是集合中的元素个数
char first[10][10];
char last[10][10];
int fflag[10]= {0};
int lflag[10]= {0};
int deal();//分析过程
int zhongjie(char c);//判断字符是否是终结符
int xiabiao(char c);//非终结符在lable中的下标
void out(int jint kchar *s);
void firstvt(char c);
void lastvt(char c);
void table();//生成转化的文法和算符优分析系表
int main(void)
{
int ijk=0;
printf(“请输入文法规则数:“);
scanf(“%d“&r);
printf(“请输入文法规则:\n“);
for(i=0; i scanf(“%s“st[i]);
first[i][0]=0;
last[i][0]=0;
}
//判断是否是算符文法
for(i=0; i for(j=0; st[i][j]!=‘\0‘; j++) {
if(st[i][0]<‘A‘||st[i][0]>‘Z‘) {
printf(“不是算符文法!\n“);
exit(-1);
}
if(st[i][j]>=‘A‘&&st[i][j]<=‘Z‘) {
if(st[i][j+1]>=‘A‘&&st[i][j+1]<=‘Z‘) {
printf(“不是算符文法!\n“);
exit(-1);
}
}
}
}
//除大写字母、->和|之外的所有字符规定为终结符
for(i=0; i for(j=0; st[i][j]!=‘\0‘; j++) {
if((st[i][j]<‘A‘||st[i][j]>‘Z‘)&&st[i][j]!=‘-‘&&st[i][j]!=‘>‘&&st[i][j]!=‘|‘)
lable[k++]=st[i][j];
}
}
lable[k]=‘#‘;
lable[k+1]=‘\0‘;
table();//去除|转换化文法
printf(“每个非终结符的FIRSTVT集为:\n“);
for(i=0; i printf(“%c: “st[i][0]);
for(j=0; j printf(“%c “first[i][j+1]);
}
printf(“\n“);
}
printf(“每个非终结符的LASTVT集为:\n“);
for(i=0; i printf(“%c: “st[i][0]);
for(j=0; j printf(“%c “last[i][j+1]);
}
printf(“\n“);
}
printf(“算符优先分析表如下:\n“);
for(i=0; lable[i]!=‘\0‘; i++) {
printf(“\t%c“lable[i]);
}
printf(“\n“);
for(i=0; i printf(“%c\t“lable[i]);
for(j=0; j printf(“%c\t“data[i][j]);
}
printf(“\n“);
}
printf(“请输入文法输入符号串以#结束:“);
scanf(“%s“input);
deal();
system(“pause“);
return 0;
}
void table()
{
char text[20][10];
int ijktlx=0y=0;
int mn;
x=0;
for(i=0; i firstvt(st[i][0]);
lastvt(st[i][0]);
}
//把st文法中的|去掉并放入text文法中
for(i=0; i text[x][y]=st[i][0];
y++;
for(j=1; st[i][j]!=‘\0‘; j++) {
if(st[i][j]==‘|‘) {
text[x][y]=‘\0‘;
x++;
y=0;
text[x][y]=st[i][0];
y++;
text[x][y++]=‘-‘;
text[x][y++]=‘>‘;
} else {
text[x][y]=st[i][j];
y++;
}
}
text[x][y]=‘\0‘;
x++;
y=0;
}
r1=x;
//输出转化后的文法规则串
printf(“转化后的文法为:\n“);
for(i=0; i printf(“%s\n“text[i]);
}
//把文法中的->符号去掉并放在string[i]中
for(i=0; i string[i][0]=text[i][0];
for(j=3l=1; text[i][j]!=‘\0‘; j++l++)
string[i][l]=text[i][j];
string[i][l]=‘\0‘;
}
//构造算符优先分析表
for(i=0; i for(j=1; text[i][j+1]!=‘\0‘; j
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 60416 2016-03-01 15:04 编译原理实验报告参考模板.doc
文件 8873 2016-05-22 22:47 算符优先分析程序.c
- 上一篇:数字逻辑电路课程设计自动洗涤系统设计
- 下一篇:ANSYS材料库267338
相关资源
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
- 龙书《编译原理》(Compilers:Principle
- 编译原理复习题
- 天津理工大学编译原理实验2
- 程序设计语言编译原理_陈火旺_第3版
- 编译原理CP lab实验报告.doc
- 编译原理.zip
- 编译原理基础习题与上机题解答
- LR0分析表自动生成程序_界面输入产生
- 编译原理与实践课后习题答案中文英
- 编译原理_第二版_(陈意云_著)_高等
评论
共有 条评论