• 大小: 10KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2022-10-04
  • 语言: C/C++
  • 标签:

资源简介

词法分析器源代码(C语言和c++语言)为编译原理课程设计课题,实现了一个功能简单能够对C文件进行分析的词法分析器

资源截图

代码片段和文件信息


#include 
#include 
#include 
#include 
const int MAX=30;
const int MAXSIZE=80;
char css[MAX][MAXSIZE];//存放产生式,并以‘#‘结束
int F[MAX][MAXSIZE];//二维数组表示FirstVT(P)表
int L[MAX][MAXSIZE];//二维数组表示LastVT(P)表
char strVN[MAX];//存放非终结符
char strVT[MAXSIZE];//存放终结符
int Priority_Table[MAX][MAX];//优先表
char Sentence[MAXSIZE];//用以存放用户从键盘上读入一个句子最大长度不超过MAXSIZE个字符
int CountVT;//存放终结符个数
int CountVN;//存放非终结符个数
int SCount;//存放句子长度
int Maxline;//存放输入产生式的个数
typedef struct
{
char VN;//非终结符,均用大写英文字母表示
char VT;//终结符,算符或小写英文字母或分隔符
}VNODE;
typedef struct
{
VNODE *base;
int top;//栈顶指针
}Stack;
void InitStack(Stack &S)
{
S.base=new VNODE[MAXSIZE];
S.top=-1;
}
int IsEmptyStack(Stack S)
{
if(S.top<=-1)
return 1;
return 0;
}
void ClearStack(Stack &S)
{
S.top=-1;
}
void Push(Stack &Schar Pchar a)
{
if(S.top>=MAXSIZE)
{
cerr<<“Stack is overflow!“< exit(0);
}
    S.top++;
S.base[S.top].VN=P;
S.base[S.top].VT=a;
}
void Pop(Stack &Schar &Qchar &a)
{
if(S.top<=-1)
{
cerr<<“Stack is empty!“< exit(0);
}
Q=S.base[S.top].VN;
a=S.base[S.top].VT;
S.top--;
}
int IsVN(char ch)
{
if(ch>=‘A‘&&ch<=‘Z‘)
return 1;
return 0;
}//IsVN()

int IsVT(char ch)
{
if(!IsVN(ch)&&ch!=‘|‘)
return 1;
return 0;
}//IsVT()

void SearchVT()
{
int i=0jk=0l;
while(strcmp(css[i]“#“)!=0)
{
j=3;
while(css[i][j]!=‘\0‘)
{
if(IsVT(css[i][j]))
{
if(k==0)
                   strVT[k++]=css[i][j];
else{
      for(l=0;l     if(l>=k)
strVT[k++]=css[i][j];
}//else
}
j++;
}
i++;
}
strVT[k++]=‘#‘;
CountVT=k;
}//SearchVT()

void SearchVN()
{
int i=0j=0k;
while(strcmp(css[i]“#“)!=0)
{
if(j==0)
  strVN[j++]=css[i][0];
else{
for(k=0;k if(k>=j)
strVN[j++]=css[i][0];
}//else
i++;
}
CountVN=j;
}//SearchVN()

int IsSFWF()//判断是否为算符文法
{
int i=0jk;
char *p;
while(strcmp(css[i]“#“)!=0)
{
p=css[i];j=3;//前三个分别存放非终结符和尖号,即“P->“
while(*(p+j)!=‘\0‘)
{
k=j;
if(IsVN(*(p+j)))
{
j++;
if(*(p+j)!=‘\0‘&&IsVN(*(p+j)))
return 0;
else if(*(p+j)==‘\0‘) 
   break;
if(*(p+j)!=‘\0‘&&(IsVT(*(p+j))||*(p+j)==‘|‘))
{
j=k+1;
continue;
}
}
j++;
}
i++;
}
return 1;
}//IsSFWF()

int Ch_to_Num(char ch)
{
int i;
if(IsVT(ch))
{
   for(i=0;i       if(ch==strVT[i])
    return i+1;
}
if(IsVN(ch))
{
        for(i=0;i    if(ch==strVN[i])
  return i+1;
}
return 0;//表示不存在或没有找到
}//Ch_to_Num()

void Insert(Stack &Schar Pchar aint flag)//flag是标志,其中0代表置F表,1代表置L表
{
int ij;
i=Ch_to_Num(P);
j=Ch_to_Num(a);
if(i>0&&j>0)
{
  switch(flag)
  {
  case 0: if(!F[i-1][j-1])
  F[i-1][j-1]=1;break;
  case 1: if(!L[i-1][j-1])
  L[i-1][j-1]=1;break

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      13483  2008-10-09 11:02  C%2B%2B词法分析器(源代码).cpp

     文件      40142  2008-12-17 14:54  代码.rtf

----------- ---------  ---------- -----  ----

                53625                    2


评论

共有 条评论