资源简介
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语言的嵌入式汇编基本使用.docx(2页
- stm32f103c8t6开发板原理图+pcb
- Arduino 敲琴MIDI电子琴 程序报告.docx
- CAN实验
- LCD驱动芯片ST7701SI SPI接口底层驱动配
- 显示屏操作(stm32f103c8t6(SAN))
- USB CAN Tool 源代码(LabVIEW 2011环境)
- Proteus 8.6仿真STM32F103C6
- atmega128 串口通讯(RS485.c)
- 超声波水表源代码
- C语言嵌入式Modbus协议栈,支持主站和
- stm32 +w5500 裸机 远程升级 自动dns pi
- 永磁同步电机的FOC控制算法
- arduino I2C设备扫描并串口返回地址(
- Proteus仿真:LCD液晶屏显示.rar
- STM32 PCB封装库 全系列 全网不好找
- 基于STM32F407的W5500 tcpserver(官网例程
- 步进电机调速原理.c
- 一个模糊PID温度控制算法源代码
- tm1650+stm32f103源码(board_tm1650.c)
- 颜色识别形状识别STM103嵌入式代码
- 基于STM32的音频信号采样与FFT分析
- 汽车电子编程规范(Unlock-MISRA C 2012)
- cheat engine 7.2源码
- 基于STM32F103C8T6主控板使用BH1750检测光
- cubeMX设计实现stm32f407上的CAN及485的通
- stm32 BootLoader程序(main.c)
- 新编Windows API参考大全.doc
- CrySearch内存搜索器源码
- 数据结构 图的遍历源代码
评论
共有 条评论