资源简介
假使给定任意文法G(E): E->E+T|T
T->T*P|P
P->(E)|i
1. 如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;
2. 如果输入符号串不是正确句子,则指示出错位置。
代码片段和文件信息
#include “stdio.h“
#include “stdlib.h“
#include “iostream.h“
char data[20][20]; //算符优先关系
char s[100]; //模拟符号栈s
char lable[20]; //文法终极符集
char input[100]; //文法输入符号串
char string[20][10]; //用于输入串的分析
int k;
char a;
int j;
char q;
int r; //文法规则个数
int r1; //转化后文法规则个数
char st[10][30]; //用来存储文法规则
char first[10][10]; //文法非终结符FIRSTVT集
char last[10][10]; //文法非终结符LASTVT集
int fflag[10]={0}; //标志第i个非终结符的FIRSTVT集是否已求出
int lflag[10]={0}; //标志第i个非终结符的LASTVT集是否已求出
int deal(); //对输入串的分析
int zhongjie(char c); //判断字符c是否是终极符
int xiabiao(char c); //求字符c在算符优先关系表中的下标
void out(int jint kchar *s); //打印s栈
void firstvt(char c); //求非终结符c的FIRSTVT集
void lastvt(char c); //求非终结符c的LASTVT集
void table(); //创建文法优先关系表
int main()
{
int ijk=0;
printf(“请输入文法规则数:“);
scanf(“%d“&r);
printf(“请输入文法规则:\n“);
for(i=0;i {
scanf(“%s“st[i]); //存储文法规则,初始化FIRSTVT集和LASTVT集*/
first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极
符的FIRSTVT集和LASTVT集中元素的个数*/
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“); //输出每个非终结符的FIRSTVT集
for(i=0;i {
printf(“%c: “st[i][0]);
for(j=0;j {
printf(“%c “first[i][j+1]);
}
printf(“\n“);
}
printf(“每个非终结符的LASTVT集为:\n“); //输出每个非终结符的LASTVT集
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();
}
void table()
{
char text[20][10];
int ijktlx=0y=0;
int mn;
x=0;
for(i
- 上一篇:小学生数学测试软件C语言
- 下一篇:最大团问题C语言算法设计与分析
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
- C语言简化编译器前端 编译原理 LR1
评论
共有 条评论