資源簡介
這是一個由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
評論
共有 條評論