资源简介
这是一个由C语言编写的语法分析器,采用算符优先算法,source文件中读取算符优先分法后构造FIRSTVT和LASTVT集,并构造优先关系表,最有打印详细规约过程。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#define M 20
#define N 20
#define SIZE 50
#define NUM 10
typedef struct{
char E;
char e;
}Element;
typedef struct{
Element *base;
Element *top;
int stacksize;
}SqStack;
int Line;
char F[M];
char f[N];
char FT[M][N];
char FV[M][N];
SqStack s;
void InitStack(SqStack &s){
s.base=(Element*)malloc(SIZE*sizeof(Element));
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=SIZE;
}
void Push(SqStack &sElement &e){
if(s.top-s.base>=s.stacksize){
s.base=(Element*)realloc(s.base(s.stacksize+NUM)*sizeof(Element));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=NUM;
}
s.top->E=e.E;
s.top->e=e.e;
s.top++;
}
void Pop(SqStack &sElement &f)
{
if(s.top==s.base)
printf(“栈以空!“);
s.top--;
f.e=s.top->e;
f.E=s.top->E;
}
int IsEmpty(SqStack s)
{
if(s.top==s.base)
return 1;
else
return 0;
}
int IsF(char ch)
{
if(ch!=‘-‘&&ch!=‘>‘&&ch!=‘|‘)
{
if(ch>=‘A‘&&ch<=‘Z‘)
return 1;
else
return 0;
}
else
return 2;
}
int Judge(char *pchar ch)
{
int i;
for(i=0;i {
if(p[i]==ch)
return 0;
}
return 1;
}
int Choose(char ch)
{
if(ch==‘-‘||ch==‘>‘)
return 0;
if(ch==‘|‘)
return 1;
else
return 2;
}
void Init(char T[][N])
{
int ij;
for(i=0;i for(j=0;j T[i][j]=0;
}
void GetBC()
{
FILE *fp;
char ch;
int i=0j=0;
if((fp=fopen(“d:\\source.txt““r“))==NULL)
{
printf(“open file error!“);
exit(0);
}
while(!feof(fp))
{
ch=fgetc(fp);
if(ch==‘\n‘)
continue;
if(IsF(ch)==1)
{
if(Judge(Fch))
F[i++]=ch;
}
if(IsF(ch)==0)
{
if(Judge(fch))
f[j++]=ch;
}
}
F[i]=‘\0‘;
f[--j]=‘\0‘;
fclose(fp);
}
void GetPro(char p[][N] )
{
FILE *fp;
char ch;
int i=0j=0;
int k=0flag=0;
if((fp=fopen(“d:\\source.txt““r“))==NULL)
{
printf(“Open error!“);
exit(1);
}
for(i=0;flag==0;i++)
{
for(j=0;j {
if(k!=0)
{
k=0;
p[i][j]=p[i-1][j];
continue;
}
ch=fgetc(fp);
if(ch==‘\n‘)
break;
if(feof(fp)>0)
{
flag=1;
break;
}
if(Choose(ch)!=0)
{
if(ch!=‘|‘)
p[i][j]=ch;
else
{
k++;
break;
}
}
else
j--;
}
p[i][j]=‘\0‘;
}
Line=i;
printf(“已从文件source.txt中读取你的文法!\n\n“);
fclose(fp);
}
void Insert(char Pchar achar T[][N])
{
int ij;
Element W;
for(i=0;i if(F[i]==P)
break;
fo
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 58368 2009-05-17 22:57 language\language.ncb
文件 66560 2009-05-17 22:56 language\Debug\vc60.idb
文件 61440 2009-05-17 22:53 language\Debug\vc60.pdb
文件 196659 2009-05-17 22:53 language\Debug\language.exe
文件 549888 2009-05-17 22:53 language\Debug\language.pdb
文件 22331 2009-05-17 20:01 language\Debug\Test.obj
文件 290832 2009-05-17 20:02 language\Debug\Test.pch
文件 451584 2009-05-17 20:09 language\Debug\Test.pdb
文件 290832 2009-05-17 21:29 language\Debug\language.pch
文件 253668 2009-05-17 22:53 language\Debug\language.ilk
文件 31258 2009-05-17 22:53 language\Debug\language.obj
文件 752 2009-05-17 22:53 language\language.plg
文件 3425 2009-05-17 22:53 language\language.dsp
文件 10060 2009-05-17 22:57 language\language.cpp
文件 48640 2009-05-17 22:57 language\language.opt
文件 522 2009-05-17 22:57 language\language.dsw
目录 0 2009-05-15 23:04 language\Debug
目录 0 2009-05-15 23:04 language
----------- --------- ---------- ----- ----
2336819 18
评论
共有 条评论