c语言词法分析器 - fertiland的专栏 - CSDNBlog
来源:百度文库 编辑:神马文学网 时间:2024/04/29 02:47:17
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘[‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(右中括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘]‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左中括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘-‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘-‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
else if (ch==‘>‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(指针运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(负运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘.‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(点运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘&‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(地址与运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘!‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(不等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(取反运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘~‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(按位运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘*‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(乘运算符\t,%-16s)\t%4d\t\n",count,token,i);
continue;
}
else if(ch==‘%‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(求余运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘/‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(除法运算符\t,%-16s)\t%4d\t\n",count,token,i);
continue;
}
else if(ch==‘<‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(小于等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
if(ch==‘<‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左移运算符\t,%-16s)\t%4d\t\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(小于比较符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘>‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(大于等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
if(ch==‘>‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(右移运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(大于比较符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘=‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(赋值运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘,‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(逗号界符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘;‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(分号界符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘{‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘}‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘+‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘+‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(加运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘"‘)
{
token[i++]=ch;
ch=fgetc(input);
while(ch!=‘"‘&&ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
if(ch==‘"‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(字符串\t\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else
{
while(ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(字符串错误\t,%-16s)\t%4d\n",count,token,i);
}
}
else
{
while(ch!=‘ ‘&&ch!=‘\t‘&&ch!=‘\n‘&&ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(无法识别错误\t,%-16s)\t%4d\n",count,token,i);
continue;
}
}
fclose(input);
fclose(output);
}
/*判断是不是关键字:
1,则是标识符
0,则是关键字
2,则是运算符
*/
int reserver(char *str)
{
FILE *fpReserver;
char *tmpStr=‘\0‘;
if(strcmp(str,"sizeof")==0)
return 2;
/*打开关键字文件*/
if((fpReserver=fopen("keyword.txt","r"))==NULL)
{ printf("file open in readonly mode,but an error generate!\n");
exit(0);
}
while(fscanf(fpReserver,"%s",tmpStr)!=EOF)
if(strcmp(str,tmpStr)==0)
{fclose(fpReserver);return 0;}
fclose(fpReserver);
return 1;
}
/*
输入文件input.txt
#include
void E(char *);
void E1(char *);
void T(char *);
void T1(char *);
void F(char *);
void main()
{
char *str="i+(i*i";
printf("%s\n",str);
E(str);
}
void E(char *str)
{
T(str);
printf("1%s\n",str);
E1(str);
printf("2%s\n",str);
}
void E1(char *str)
{
if (*str==‘+‘)
{
str++;
T(str);
E1(str);
}
}
void T(char *str)
{
F(str);
T1(str);
}
void T1(char *str)
{
if(*str==‘*‘)
{
str++;
F(str);
T1(str);
}
}
void F(char *str)
{
if(*str==‘(‘)
{
str++;
E(str);
if(*str==‘)‘)
str++;
else
{
printf("lost ‘)‘\n");
exit(0);
}
}
else if(*str==‘i‘)
str++;
else
{
printf("lost variable\n");
exit(0);
}
}
*/
/*
关键字文件keyword.txt
auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while
*/
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘[‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(右中括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘]‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左中括号运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘-‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘-‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
else if (ch==‘>‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(指针运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(负运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘.‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(点运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘&‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(地址与运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘!‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(不等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(取反运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘~‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(按位运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘*‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(乘运算符\t,%-16s)\t%4d\t\n",count,token,i);
continue;
}
else if(ch==‘%‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(求余运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘/‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(除法运算符\t,%-16s)\t%4d\t\n",count,token,i);
continue;
}
else if(ch==‘<‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(小于等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
if(ch==‘<‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(左移运算符\t,%-16s)\t%4d\t\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(小于比较符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘>‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(大于等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
if(ch==‘>‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(右移运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(大于比较符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘=‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘=‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(等于比较符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(赋值运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘,‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(逗号界符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘;‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(分号界符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘{‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘}‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(边界运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘+‘)
{
token[i++]=ch;
ch=fgetc(input);
if(ch==‘+‘)
{
token[i++]=ch;
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(自加运算符\t,%-16s)\t%4d\n",count,token,i);
ch=fgetc(input);
continue;
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(加运算符\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else if(ch==‘"‘)
{
token[i++]=ch;
ch=fgetc(input);
while(ch!=‘"‘&&ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
if(ch==‘"‘)
{
token[i++]=ch;
ch=fgetc(input);
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(字符串\t\t,%-16s)\t%4d\n",count,token,i);
continue;
}
else
{
while(ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(字符串错误\t,%-16s)\t%4d\n",count,token,i);
}
}
else
{
while(ch!=‘ ‘&&ch!=‘\t‘&&ch!=‘\n‘&&ch!=EOF)
{
token[i++]=ch;
ch=fgetc(input);
}
token[i]=‘\0‘;
count++;fprintf(output,"%4d\t(无法识别错误\t,%-16s)\t%4d\n",count,token,i);
continue;
}
}
fclose(input);
fclose(output);
}
/*判断是不是关键字:
1,则是标识符
0,则是关键字
2,则是运算符
*/
int reserver(char *str)
{
FILE *fpReserver;
char *tmpStr=‘\0‘;
if(strcmp(str,"sizeof")==0)
return 2;
/*打开关键字文件*/
if((fpReserver=fopen("keyword.txt","r"))==NULL)
{ printf("file open in readonly mode,but an error generate!\n");
exit(0);
}
while(fscanf(fpReserver,"%s",tmpStr)!=EOF)
if(strcmp(str,tmpStr)==0)
{fclose(fpReserver);return 0;}
fclose(fpReserver);
return 1;
}
/*
输入文件input.txt
#include
void E(char *);
void E1(char *);
void T(char *);
void T1(char *);
void F(char *);
void main()
{
char *str="i+(i*i";
printf("%s\n",str);
E(str);
}
void E(char *str)
{
T(str);
printf("1%s\n",str);
E1(str);
printf("2%s\n",str);
}
void E1(char *str)
{
if (*str==‘+‘)
{
str++;
T(str);
E1(str);
}
}
void T(char *str)
{
F(str);
T1(str);
}
void T1(char *str)
{
if(*str==‘*‘)
{
str++;
F(str);
T1(str);
}
}
void F(char *str)
{
if(*str==‘(‘)
{
str++;
E(str);
if(*str==‘)‘)
str++;
else
{
printf("lost ‘)‘\n");
exit(0);
}
}
else if(*str==‘i‘)
str++;
else
{
printf("lost variable\n");
exit(0);
}
}
*/
/*
关键字文件keyword.txt
auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while
*/
c语言词法分析器 - fertiland的专栏 - CSDNBlog
C语言测试题的讲解分析 - 张孝祥专栏 - CSDNBlog
gcc编译c语言中内嵌汇编 - fifan的专栏 - CSDNBlog
C armman的专栏 - CSDNBlog
伟大的C语言 - - CSDNBlog
简单的表达式语言--EL - zm1313的专栏 - CSDNBlog
古龙经典语言 - 亦风亦尘的专栏 - CSDNBlog
经典的C 库 - xlvector的专栏 - CSDNBlog
同感一篇文章“ 我们的感情在C语言时创建,在J2EE时消亡(程序人生)” - fannian的专栏 - CSDNBlog
IvanHome--编译原理之词法分析器-----pass!
在 console mode 中使用 C/C 编译器 - Kevin的专栏 - CSDNBlog
C 如何支持属性 - jsjwql专栏 - CSDNBlog
C语言宏的学习: - henry19850318的专栏 - CSDN博客
C语言宏的学习: - henry19850318的专栏 - CSDN博客
C语言字符串函数大全 - amossavez的专栏 - CSDN博客
c/c 随机数产生相同解决方案 - 帐前卒 专栏 - CSDNBlog
c 四种不同的对象生存方式 - shkkhd的专栏 - CSDNBlog
C 各大有名库的介绍(一) - armman的专栏 - CSDNBlog
C 各大有名库的介绍 zz - denny的专栏 - CSDNBlog
网管必须熟悉的几个网络DOS命令 - C&M专栏 - CSDNBlog
C 资源之不完全导引(完整版) - ugg的专栏 - CSDNBlog
用C# 实现C/S模式下软件自动在线升级 - wzq6511的专栏 - CSDNBlog
逆向 C -- 识别类及其构造函数 - FISH 的专栏 - CSDNBlog
我对C语言文件的理解 - 虎城空间 - CSDNBlog