#include <stdio.h>
#define MAX 500 /*标识符的最大长度*/
main()
{
FILE *in,*out;
char word[MAX]; /*存储标识符*/
char cp; /*存储当前读入字符*/
int i;
if((in=fopen("in.txt","r"))==NULL)
{
printf("不能打开文档in.txt,请检查根目录下是否存在该文档\n");
exit(0);
}
else
{
printf("成功打开文档in.txt\n");
}
if((out=fopen("out.txt","w"))==NULL)
{
printf("不能打开文档out.txt,请检查根目录下是否存在该文档\n");
exit(0);
}
else
{
printf("成功打开文档out.txt\n");
}
cp=fgetc(in);
while(cp!=EOF)
{
/*消耗掉空格,制表符,换行符*/
while(cp==' '||cp=='\t'||cp=='\n')
{
cp=fgetc(in);
}
/*cp数组复位*/
i=0;
/*数字检测*/
if(cp>='0'&&cp<='9')
{
word[i++]=cp;
cp=fgetc(in);
while(cp>='0'&&cp<='9')
{
word[i++]=cp;
cp=fgetc(in);
}
if(cp==' '||cp=='\t'||cp=='\n'||cp=='='||cp=='+'||cp=='-'||cp=='*'||cp=='/'||cp=='>'||cp=='<'||cp=='!'||cp==';'||cp==':'||cp==','||cp=='{'||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')')
{
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',28,')');
}
else
{
while(cp!=' '&&cp!='\t'&&cp!='\n'&&cp!='='&&cp!='+'&&cp!='-'&&cp!='*'&&cp!='/'&&cp!='>'&&cp!='<'&&cp!='!'&&cp!=';'&&cp!=':'&&cp!=','&&cp!='{'&&cp!='}'&&cp!='['&&cp!=']'&&cp!='('&&cp!=')')
{
word[i++]=cp;
cp=fgetc(in);
}
word[i]='\0';
fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符");
}
continue;
}
/*字符串检测*/
if((cp>='a'&&cp<='z')||(cp>='A'&&cp<='Z')||cp=='_')
{
while((cp>='a'&&cp<='z')||(cp>='0'&&cp<='9')||(cp>='A'&&cp<='Z')||cp=='_')
{
word[i++]=cp;
cp=fgetc(in);
}
if(cp==' '||cp=='\t'||cp=='\n'||cp=='='||cp=='+'||cp=='-'||cp=='*'||cp=='/'||cp=='>'||cp=='<'||cp=='!'||cp==';'||cp==':'||cp==','||cp=='{'||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')')
{
word[i]='\0';
/*基本保留字检测*/
if(strcmp(word,"main")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',1,')');
else if(strcmp(word,"void")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',2,')');
else if(strcmp(word,"int")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',3,')');
else if(strcmp(word,"float")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',4,')');
else if(strcmp(word,"double")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',5,')');
else if(strcmp(word,"char")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',6,')');
else if(strcmp(word,"struct")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',7,')');
else if(strcmp(word,"const")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',8,')');
else if(strcmp(word,"extern")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',9,')');
else if(strcmp(word,"register")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',10,')');
else if(strcmp(word,"static")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',11,')');
else if(strcmp(word,"if")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',12,')');
else if(strcmp(word,"else")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',13,')');
else if(strcmp(word,"switch")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',14,')');
else if(strcmp(word,"case")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',15,')');
else if(strcmp(word,"for")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',16,')');
else if(strcmp(word,"do")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',17,')');
else if(strcmp(word,"while")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',18,')');
else if(strcmp(word,"goto")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',19,')');
else if(strcmp(word,"continue")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',20,')');
else if(strcmp(word,"break")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',21,')');
else if(strcmp(word,"default")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',22,')');
else if(strcmp(word,"sizeof")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',23,')');
else if(strcmp(word,"return")==0)
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',24,')');
else
fprintf(out,"自定义标识符:%c%c%s%c,%d%c\n",'(','"',word,'"',29,')');
}
/*排错处理(只能以字母、数字、下划线构成)*/
else
{
while(cp!=' '&&cp!='\t'&&cp!='\n'&&cp!='='&&cp!='+'&&cp!='-'&&cp!='*'&&cp!='/'&&cp!='>'&&cp!='<'&&cp!='!'&&cp!=';'&&cp!=':'&&cp!=','&&cp!='{'&&cp!='}'&&cp!='['&&cp!=']'&&cp!='('&&cp!=')')
{
word[i++]=cp;
cp=fgetc(in);
}
word[i]='\0';
fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符");
}
continue;
}
/*运算符*/
if(cp=='+')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',31,')');
cp=fgetc(in);
continue;
}
if(cp=='-')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',32,')');
cp=fgetc(in);
continue;
}
if(cp=='*')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',33,')');
cp=fgetc(in);
continue;
}
if(cp=='/')
{
word[i++]=cp;
cp=fgetc(in);
if(cp=='*'){word[--i]='\0';while(cp!='/'){cp=fgetc(in);}cp=fgetc(in);}
else
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',34,')');
word[i]='\0';
continue;
}
if(cp=='=')
{
word[i++]=cp;
cp=fgetc(in);
if(cp=='=')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',39,')');
cp=fgetc(in);
}
else
{
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',27,')');
}
continue;
}
if(cp=='<')
{
word[i++]=cp;
cp=fgetc(in);
if(cp=='=')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',36,')');
cp=fgetc(in);
}
else
{
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',35,')');
}
continue;
}
if(cp=='>')
{
word[i++]=cp;
cp=fgetc(in);
if(cp=='=')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',38,')');
cp=fgetc(in);
}
else
{
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',37,')');
}
continue;
}
if(cp=='!')
{
word[i++]=cp;
cp=fgetc(in);
if(cp=='=')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',40,')');
cp=fgetc(in);
}
else
{
word[i]='\0';
fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符");
}
continue;
}
/*界符*/
if(cp==';')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',41,')');
cp=fgetc(in);
continue;
}
if(cp==':')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',42,')');
cp=fgetc(in);
continue;
}
if(cp==',')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',43,')');
cp=fgetc(in);
continue;
}
if(cp=='{')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',44,')');
cp=fgetc(in);
continue;
}
if(cp=='}')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',45,')');
cp=fgetc(in);
continue;
}
if(cp=='[')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',46,')');
cp=fgetc(in);
continue;
}
if(cp==']')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',47,')');
cp=fgetc(in);
continue;
}
if(cp=='(')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',48,')');
cp=fgetc(in);
continue;
}
if(cp==')')
{
word[i++]=cp;
word[i]='\0';
fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',49,')');
cp=fgetc(in);
continue;
}
/*不能识别的字符*/
word[i++]=cp;
cp=fgetc(in);
word[i]='\0';
fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符");
}
fclose(in);
fclose(out);
printf("成功对in.txt文档内代码进行词法分析,分析结果保存在out.txt文档中\n");
return 0;
}
分享到:
相关推荐
编译原理词法分析器源程序C语言实现 本资源是一个使用C语言实现的编译原理词法分析器源程序,主要功能是对输入的源程序进行词法分析,识别出关键字、标识符、数字等 token,并将其输出。 1. 编译原理 编译原理是...
- 设计并实现一个词法分析器,能够识别输入的源程序字符串中的单词,并将其转换为计算机更易于处理的形式。 - 加深对C语言的理解和应用能力。 ### 2. 实验内容 #### 2.1 输入输出 - **输入**:任意的一段程序...
根据给定的文件标题“编译原理词法分析器源代码”、描述“很好的一个资源,保证你用的放心,编译用的是C语言办的,而且功能很齐全”,以及部分展示的源代码内容,我们可以从中提取出以下知识点: ### 1. 词法分析器...
通过这个C语言实现的词法分析器,学生可以深入理解编译原理中词法分析的概念,并且通过源码学习到实际的编程实现技巧。这个简单的实现虽然没有涵盖所有可能的错误处理,但对于初学者来说,它提供了一个清晰的起点,...
本资源提供了关于词法分析器的源代码,特别适合进行课程设计或深入学习编译器构造。 词法分析器,也称为扫描器或tokenizer,主要任务是将输入的源程序分解成一系列的有意义的符号,即词法单元(tokens)。这些词法...
《编译原理 词法分析器 源代码 实验报告》 编译原理是计算机科学中的重要领域,它涉及到程序设计语言的处理过程。词法分析器是编译器的第一步,它从源代码中识别出有意义的词汇单元,为后续的语法分析打下基础。这...
### 编译原理课程设计-词法分析器 #### 一、设计说明及设计要求 在计算机科学领域,编译器的设计与实现是一项极其重要的任务。编译器负责将高级语言编写的人类可读的源代码转换为机器可执行的目标代码。这一过程...
编译原理 词法分析 C语言 源代码
源代码在编译原理的实验中是实际操作的部分,你需要编写词法分析器和语法分析器的代码。这部分工作需要扎实的编程基础,尤其是对数据结构和算法的理解。例如,你可能会用到栈、队列、递归下降解析等技术。同时,错误...
6. **源代码**:包含实现词法分析器的源代码,这通常是以某种编程语言(如C、C++或Java)编写的。 `JinzhishuTest`可能是一个测试工具或测试用例集,用于验证词法分析器的功能。这个文件可能包含了各种类型的源代码...
在这个“编译原理词法分析程序(C语言)”项目中,我们关注的是如何用C语言实现一个词法分析器。 词法分析器的主要任务是从源代码中识别出关键字、标识符、常量、运算符以及分隔符等基本元素。在C语言中,这些元素都...
本资料"词法分析源代码"提供了实现词法分析器的实例,这对于学习编译原理的实践者来说是非常有价值的。通过阅读和理解这段代码,你可以了解如何将源代码文本转换为一系列的标记,这包括如何定义和匹配词法规则,如何...
词法分析器通常由两部分组成:模式定义和扫描器(或词法分析器)。模式定义描述了源代码中的各种词法单元,而扫描器则负责识别这些模式。 在这个实验中,我们使用Java编写词法分析器,Java是一种广泛使用的面向对象...
词法分析器将输入的源代码字符串转化为一系列的记号,而解析器则根据记号构造抽象语法树(AST),进一步理解程序的结构。 “.idea”目录则是IDEA工作空间的配置文件夹,包含项目设置、运行配置、VCS集成等信息。...
在这个过程中,学生通常会被要求构建一个词法分析器,这是编译器的第一个阶段,它将源代码分解成有意义的单元——单词符号。 词法分析器,又称为扫描器或词法分析程序,它的主要任务是从源代码中识别出一个个的单词...
本资料包含的"编译原理 词法分析器 可执行源代码及参考报告"提供了深入理解和实践编译器构建的宝贵资源。 词法分析器,也称为扫描器或词法分析程序,是编译器的第一步。它的主要任务是从源代码中识别出关键字、...
词法分析器(也称为扫描器或词法规则器)的任务是从源代码中读取字符流,并根据预定义的词法规则将其转换成一个个的token。这些规则通常包括关键字、标识符、常量、运算符等。在这个实验中,词法分析器被设计用来...
本文将深入探讨“C语言编写的编译原理词法分析器”的相关知识点,帮助你更好地理解和应用这一工具。 首先,我们来了解什么是编译原理。编译原理是一门计算机科学课程,主要研究如何将高级编程语言(如C、Java等)...
编译原理 简单的词法分析器 输入为源程序代码,输出(单词,种别码)序列
在学习编译原理时,编写词法分析器和语法分析器的源代码是一项重要的实践任务。这有助于深入理解编译器的工作原理,并能培养解决实际问题的能力。通过实验报告,学生可以记录并反思自己的设计决策,进一步巩固理论...