资源简介
C语言写的语法分析器,对于给出的任意LL1文法,实现了求First集,Follow集,预测分析表的生成,分析栈分析句子的合法性。原创的

代码片段和文件信息
#include
#include
#define Stack_Size 50
char proc[50][50]; /*产生式*/
char start; /*开始符号*/
char non_ter[50]; /*非终结符*/
char termin[50]; /*终结符*/
int count; /*产生式的个数*/
char first[50][50]; /*first集*/
char follow[50][50];/*follow集*/
char M[10][10][50]={‘\0‘}; /*预测分析表*/
typedef struct{
char elem[Stack_Size];
int top;
}SeqStack;
void InitStack(SeqStack *S){ /*初始化顺序栈*/
S->top = -1;
}
int Push(SeqStack *Schar *x){ /*进栈*/
if(S->top ==Stack_Size-1)
return 0;
S->top++;
S->elem[S->top]=x;
return 1;
}
int Pop(SeqStack *S){ /*出栈*/
if(S->top==-1)
return 0;
else{
S->top--;
return 1;
}
}
int GetTop(SeqStack *Schar *x){ /*取栈顶元素*/
if(S->top==-1)
return 0;
else{
*x=S->elem[S->top];
return 1;
}
}
void ShowStack1(SeqStack *S){ /*显示栈的字符,先输出栈底元素*/
char c;
int i;
for(i=0;i<=S->top;i++)
printf(“%c“S->elem[i]);
}
void ShowStack2(SeqStack *S){ /*显示栈的字符,先输出栈顶元素*/
char c;
int i;
for(i=S->top;i>=0;i--)
printf(“%c“S->elem[i]);
}
int iss(char s[]char cint n){ /*判断字符数组s中,是否有字符c,返回下标*/
int i;
for(i=n;i if(c==s[i])
break;
}
if(i==strlen(s))
return -1;
return i;
}
void removeEqqual(char s[]){ /*除去字符数组中重复的元素*/
char str[50];
int ijm=0;
for(i=0;i str[m++] = s[i];
for(j=0;j if(s[j]==str[m-1]){
m--; break;
}
}
for(i=0;i s[i]=str[i];
s[m]=‘\0‘;
}
void init(){ /*初始化 产生式,开始符号,非终结符,终结符 */
char ch;
FILE *fp;
int ijm;
if((fp=fopen(“change.txt““r“))==NULL)
{
printf(“cannot open the file(source.txt)!“);
exit(0);
}
ch=fgetc(fp);
start= ch;
for(i =0;ch!=EOF;i++){
count++;
j=0;
non_ter[i]=ch;
while(ch!=‘\n‘&&ch!=EOF){
proc[i][j++] = ch;
ch = fgetc(fp);
}
proc[i][j]=‘\0‘;
ch = fgetc(fp);
}
m=0;
for(i=0;i for(j=3;j if(iss(non_terproc[i][j]0)==-1&&proc[i][j]!=‘$‘&&proc[i][j]!=‘|‘){
termin[m++] = proc[i][j];
}
}
}
removeEqqual(termin);
removeEqqual(non_ter);
printf(“共有%d句文法:\n“count);
for(i=0;i printf(“\t%s\n“proc[i]);
printf(“终结符有: “);
for(i=0;i printf(“%c “termin[i]);
printf(“\n非终结符有: “);
for(i=0;i printf(“%c “non_ter[i]);
printf(“\n“);
}
void firstSet(){ /*求 first 集*/
int ijnmqkp;
int flag=1;
char c1[50]c2[50]c3[50];
for(i=strlen(non_ter)-1;i>=0;i--){
for(j=3;j m=0; /*先记录形如A->aB|的 a */
first[i][m++] = proc[i][3];
q = iss(non_terproc[i][3]0);
p=3;
while(q!=-1&&iss(first[q]‘$‘0)!=-1){ /*若A->aB first[a]中有$时,将B的first集加入A中*/
first[i][m++] = proc[i][p+1];
p = iss(proc[i]‘|‘p+1);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
.CA.... 58 2010-06-07 08:33 语法分析\change.txt
.CA.... 200789 2010-06-08 00:17 语法分析\Debug\test.exe
.CA.... 249920 2010-06-08 00:17 语法分析\Debug\test.ilk
.CA.... 26284 2010-06-08 00:17 语法分析\Debug\test.obj
.CA.... 181604 2010-06-07 16:47 语法分析\Debug\test.pch
.CA.... 508928 2010-06-08 00:17 语法分析\Debug\test.pdb
.CA.... 33792 2010-06-08 00:17 语法分析\Debug\vc60.idb
.CA.... 53248 2010-06-08 00:17 语法分析\Debug\vc60.pdb
.CA.... 38 2010-05-12 13:18 语法分析\source.txt
.CA.... 8346 2010-06-07 21:50 语法分析\TEST.BAK
.CA.... 9732 2010-06-08 00:17 语法分析\test.c
.CA.... 3375 2010-06-08 00:17 语法分析\test.dsp
.CA.... 533 2010-06-08 00:18 语法分析\test.dsw
.CA.... 41984 2010-06-08 00:18 语法分析\test.ncb
.CA.... 48640 2010-06-08 00:18 语法分析\test.opt
.CA.... 5798 2010-06-08 00:17 语法分析\test.plg
.C.D... 0 2010-06-08 00:21 语法分析\Debug
.C.D... 0 2010-06-11 20:39 语法分析
----------- --------- ---------- ----- ----
1373069 18
相关资源
- C++中头文件与源文件的作用详解
- 基于mfc的多线程文件传输
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 利用C++哈希表的方法实现电话号码查
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 移木块游戏,可以自编自玩,vc6.0编写
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- C++纯文字DOS超小RPG游戏
- 个人日常财务管理系统(C语言)
- MFC数字钟(基于VC6.0)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- 安科瑞智能电能表MODBUS通讯程序 VC6
- C语言实现的一个内存泄漏检测程序
评论
共有 条评论