资源简介
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
相关资源
- DHT11参考代码C语言和汇编两种 以及
- C语言,计算一个文件的16位校验和
- 图像直方图均衡化C++实现
- 指纹识别算法源代码C语言
- C语言Linux串口编程(serial.c)
- PL/0编译程序(c语言版本)
- MFC写的画图板类似Windows自带的画图
- C语言双向链表基本操作
- More effective C++ 中文版, 35个改善编程
- apriori算法(C++实现)28359
- 五子棋(棋盘)(MFC编写)
- 基于vc6开发的计算器
- C++语言编写的输入法精简模型
- c语言 选课管理系统
- 魔王语言c++
- C语言大程序游戏大富翁24707
- 基于OpenCV和MFC的手工量测同名点程序
- libstdc++.so.6.0.20
- 三角函数计算器
- c语言gbk、utf8转换编码表及函数
- c语言 五子棋源码界面美观
- c语言time()
- 图书管理系统(C语言课程设计报告
- sobel边缘检测的c/c++代码
- mfc下导出listctrl数据到excel表格
- 基于camshift的多目标跟踪算法
- 杭电ACMonline习题答案-C++版
- C++录屏代码
- A*算法 A star算法 C语言版
- opelgl基于vc的mfc写的粒子烟花效果源代
评论
共有 条评论