资源简介
词法分析器源代码(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
- 上一篇:cminus语法分析器源代码完整版
- 下一篇:sbc子带压缩编解码算法C语言
相关资源
- 编译原理——词法分析器设计与实现
- 编译原理课程设计+报告用高级语言
- c++词法分析器
- 编译原理词法分析器 输入源程序 能生
- C MINUS 词法分析器
- 编译原理_词法分析器_C语言版_简单易
- 编译原理实验——词法分析器C语言编
- WinForm程序C++词法分析器
- 编译原理词法分析器实验报告
- 编译原理实验-词法分析器
- 词法分析器源代码(c/c++)
- 简单的词法分析器
- 编译原理大作业完整的词法分析器
- C语言 词法分析器 C#实现
- 词法分析器源代码
- 词法分析器c++版
- 一个简单的lex词法分析器
- C语言编程的词法分析器,可具体定位
- 词法分析器源代码C++
- C语言词法分析器_源代码
- c++实现词法分析器
- 词法分析器c语言实现
- 我用MFC写的词法分析器
- c语言 词法分析器实验报告及源代码
- 词法分析器C语言编写附实验报告
- c语言词法分析器(能够识别保留字,
- 词法分析器C语言手工生成
- 基于LEX的C语言词法分析器
- 利用LEX自动生成词法分析程序
- 实现词法分析器
评论
共有 条评论