[代码] [C/C++]代码
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define FILENAME "e:/a.java"
enum type
{
blz,//保留字
bzf,//标识符
cs,//常数
zfcl,//字符常量
zfccl,//字符串常量
dzf,//单字符
szf//双字符
};
typedef struct output
{
int type;
union{
char *_strvalue;
char _charvalue;
int _intvalue;
float _floatvalue;
double _doublevalue;
}value;
struct output *pnext;
struct output *ppre;
} output;
int linenumber=0;
char getAChar(FILE *pfile);
char *getString(FILE *pfile);
char isDzf(char c);
output *createOuput(output *srcolutput);
char *getTypeChars(char c,FILE *pfile);
output *process(FILE *pfile);
char *constans_pool[]={
"package",
"class",
"int",
"double",
"float",
"byte",
"boolean",
"char",
"short",
"public",
"private",
"protocted",
"synchronized",
"instanceof",
"extends",
"implements",
"throw",
"throws",
"if",
"else",
"for",
"while",
"return",
"continue",
"break",
"switch",
"case","void","keyword"};
int main()
{
output *phead=NULL,*pcurt=NULL;
FILE *pfile=fopen(FILENAME,"r");
if(pfile)
phead=process(pfile);
if(phead)
{
pcurt=phead;
while(pcurt)
{
switch(pcurt->type)
{
case blz:
printf("<b>%s<b>\t",pcurt->value._strvalue);
break;
case bzf:
case zfccl:
case szf:
printf("%s\t",pcurt->value._strvalue);
break;
case zfcl:
case dzf:
printf("%c\t",pcurt->value._charvalue);
break;
case cs:
printf("%d\t",pcurt->value._intvalue);
break;
}
pcurt=pcurt->pnext;
}
}
return 0;
}
output *process(FILE *pfile)
{
char nowchar=0,prechar=0;
output *phead=NULL,*pcurt=NULL,*pnext=NULL,*ppre=NULL;
output tmp;
char *p=NULL;
char *pnowglz=NULL;
int i=0;
while(!feof(pfile))
{
prechar=nowchar;
nowchar=getAChar(pfile);
//如果是字幕
if(isalpha(nowchar))
{
p=getTypeChars(nowchar,pfile);
tmp.type=bzf;
while(strcmp(constans_pool[i],"keyword"))
{
if(strcmp(constans_pool[i],p))
{
tmp.type=blz;
break;
}
}
tmp.value._strvalue=p;
}
//如果是数字
else if(isdigit(nowchar))
{
p=getTypeChars(nowchar,pfile);
tmp.type=cs;
tmp.value._intvalue=atoi(p);
if(phead==NULL)
phead=pcurt;
}
else if(nowchar=='/')
{
nowchar=fgetc(pfile);
if(nowchar=='*')//表明是注释;
{
do
{
while(nowchar=getAChar(pfile)!='*'&&nowchar>0);
nowchar=fgetc(pfile);
}
while(nowchar!='/');
continue;
}
else if(nowchar=='/')//单行注释
{
while((nowchar=fgetc(pfile))!='\n'&&nowchar>0);
continue;
}
else
{
tmp.type=dzf;
tmp.value._charvalue='/';
ungetc(nowchar,pfile);
}
}
else if(nowchar=='=')
{
nowchar=getAChar(pfile);
if(nowchar=='=')
{
tmp.type=bzf;
*(tmp.value._strvalue)='=';
*(tmp.value._strvalue+1)='=';
}
else
{
ungetc(nowchar,pfile);
continue;
}
}
else if(nowchar=='\'')
{
nowchar=fgetc(pfile);
if(fgetc(pfile)!='\'')
printf("此处应该是单引号");
else
{
tmp.type=zfcl;
tmp.value._charvalue=nowchar;
}
}
else if(nowchar=='\"')
{
p=getString(pfile);
tmp.type=zfccl;
tmp.value._strvalue=p;
}
else if(isDzf(nowchar))
{
tmp.type=dzf;
tmp.value._charvalue=nowchar;
}
else if(nowchar<0)
// printf("end");
continue;
else
{
printf("\nerror%c\t%d\n",nowchar,linenumber);
continue;
}
phead=createOuput(&tmp);
}
return phead;
}
//判断是不是单字符
char isDzf(char c)
{
char dzfarr[]={'+','-','*','(',')','[',']','{','}',';','?','.','!','%'};
unsigned int i=0;
for(;i<sizeof(dzfarr)/sizeof(char);i++)
{
if(dzfarr[i]==c)
return dzfarr[i];
}
return 0;
}
//得到字符串常量
char *getString(FILE *pfile)
{
char nowchar[]={0,0};
char *p=NULL;
unsigned int size=4;
while((nowchar[0]=fgetc(pfile))>0&&nowchar[0]!='\"')
{
if(!p)
{
p=(char *)malloc(sizeof(char)*size);
*p=0;
}
strcat(p,nowchar);
if(strlen(p)>=size)
{
p=realloc(p,size*=2);
*(p+size/2)=0;
}
}
return p;
}
//读取同一个类型的字符加入到指针只到出现不同类型的字符
char *getTypeChars(char c,FILE *pfile)
{
char nowchar[]={c,'\0'};
char *p=NULL;
int (*pchartype)(int)=NULL;
unsigned int str_size=4;
if(isdigit(c))
pchartype=isdigit;
else if(isalnum(c))
pchartype=isalnum;
do
{
if(!p)
{
p=(char *)malloc(sizeof(char)*str_size);
*p=0;
}
strcat(p,nowchar);
if(strlen(p)>=str_size)
{
p=(char *)realloc(p,str_size*=2);
*(p+str_size/2)='\0';
}
nowchar[0]=fgetc(pfile);
}while(nowchar[0]>0&&pchartype(nowchar[0]));
ungetc(nowchar[0],pfile);
return p;
}
//创建output的链表
output *createOuput(output *srcolutput)
{
static output *pnext=NULL;
static output *ppre=NULL;
static output*phead=NULL;
output *pout=NULL;
pout=(output *)malloc(sizeof(output));
pout->pnext=NULL;
pout->type=srcolutput->type;
switch(srcolutput->type)
{
case blz:
case bzf:
case zfccl:
case szf:
pout->value._strvalue=(char *)malloc(sizeof(char)*strlen(srcolutput->value._strvalue));
*(pout->value._strvalue)=0;
strcpy(pout->value._strvalue,srcolutput->value._strvalue);
free(srcolutput->value._strvalue);
break;
case zfcl:
case dzf:
pout->value._charvalue=srcolutput->value._charvalue;
break;
case cs:
pout->value._intvalue=srcolutput->value._intvalue;
break;
}
if(!phead)
phead=pout;
if(ppre)
ppre->pnext=pout;
ppre=pout;
return phead;
}
{
jave语言}
//返回一个字符
//这个字符不为空字符。
char getAChar(FILE *pfile)
{
char c=0;
if(!pfile)
return EOF;
while((c=fgetc(pfile))=='\t'||c=='\0'||c==' '||c=='\n')
{
if(c=='\n')
linenumber++;
}
return c;
}
分享到:
相关推荐
在这个基于C语言实现的Java词法分析器中,我们探讨的核心技术包括C语言编程、正则表达式、有穷自动机(Finite State Automata, FSA)以及词法规则的定义。 首先,C语言是这个项目的编程基础。C语言以其高效、底层...
在这个Java实现的项目中,词法分析器可能包括以下几个关键部分: 1. **字符缓冲区**:为了处理连续的字符流,程序通常会维护一个字符缓冲区,用于存储已读取但尚未处理的字符。 2. **状态机**:词法分析器的核心是...
在这个项目中,我们使用Java实现了一个针对C语言的词法分析器。以下是这个实现涉及的核心知识点: 1. **词法分析**:词法分析(Lexical Analysis)是编译器前端的第一个阶段,其任务是读取源代码,识别出由字符组成...
本文将详细探讨基于Java实现的C语言词法分析器及其相关知识点。 词法分析,也称为扫描或词法分析器(Lexer或Scanner),其主要任务是从源代码中识别出一个个有意义的单元——词法单元或记号(Token)。这些记号通常...
Java编写C语言词法分析器是一项在编程领域中常见的任务,它涉及到编译原理和语言处理技术。词法分析器,也称为扫描器或词法分析程序,是编译器或解释器的第一阶段,它的主要任务是将源代码分解成一系列有意义的标记...
在这个特定的案例中,我们讨论的是一个使用C语言手动实现的Java词法分析器,而非依赖于像LEX这样的自动化工具自动生成。 词法分析器,又称为扫描器或词法分析程序,它的主要任务是识别源代码中的标识符、关键字、...
总的来说,Java写的C语言词法分析器是一个用Java实现的工具,用于分析C语言源代码的词法结构,它通过GUI交互,对源代码进行逐字符分析,识别出关键的编程元素,并在遇到不合规的输入时给出反馈。在设计和实现这样的...
在C语言中实现一个Java词法分析器,需要对编译原理有深入的理解,包括正则表达式、有限状态自动机(FA图)以及扫描器的实现。 1. **词法分析器的作用**: 词法分析器是编译器的第一个阶段,它的任务是从源代码文本...
Java编写的C语言词法分析程序是用于解析C语言源代码的工具,它在编译器前端扮演着重要角色。词法分析,也称为扫描或标记化,是编译过程的第一步,它将源代码分解成一系列有意义的、独立的单元,即标记(tokens)。...
本主题主要关注的是Java词法分析器的C语言实现,这是一项重要的编译器组件。词法分析器,也称为扫描器或词法分析程序,是编译器的第一阶段,它的任务是从源代码中识别出一个个的词汇单元,也就是我们常说的“token”...
本篇文章介绍了一个用Java实现的C语言词法分析器的基本设计与实现方法。该词法分析器能够读取存放在D盘指定位置的一个文本文件(例如名为`cifafenxi.txt`),并对其进行词法分析。 #### 主要功能与特点 1. **...
本文将深入探讨“C语言编写的编译原理词法分析器”的相关知识点,帮助你更好地理解和应用这一工具。 首先,我们来了解什么是编译原理。编译原理是一门计算机科学课程,主要研究如何将高级编程语言(如C、Java等)...
在Java中实现C语言的词法分析,我们可以使用Java的`java.util.Scanner`类或者第三方库,如ANTLR,但更常见的是自定义一个词法分析器。自定义词法分析器通常包含以下部分: 1. **输入流**: 从源代码文件中读取字符...
本项目提供了一个基于Java实现的C语言词法分析器,对于熟悉Java编程的开发者来说,这是一个很好的学习资源。 词法分析器,又称为扫描器或词法分析程序,其主要任务是识别源代码中的关键词、标识符、常量、运算符和...
JAVA写的一个C语言的词法分析器: 输入一个文本文件的C语源代码可以识别并输出至一个文本文件中,如下: # 5:界符 include 2:保留字 运算符 stdio.h 1:头文件 > 4:运算符 main 2:保留字 ( 5:界符 ) 5:界符 { 5:界符 ...
在Java语言中编写词法分析器,我们可以利用正则表达式库或者自定义的解析算法。正则表达式是定义词法规则的强大工具,能够方便地匹配各种字符模式。而自定义算法则可能涉及到状态机的设计,通过维护一系列的状态来...
使用直接分析法编制C语言子集的词法分析程序 二、目的 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法....
《C语言词法分析器小程序Java版:深入解析与应用》 C语言词法分析器是编程语言编译过程中的重要组成部分,它负责将源代码分解成一系列有意义的符号,即词法单元,为后续的语法分析和编译工作奠定基础。在本项目中,...
《简易C语言词法分析器》 在编程领域,编译原理是一门至关重要的课程,它探讨了如何将高级语言转换为计算机可理解的机器语言。在这个过程中,词法分析是第一步,它将源代码分解成一个个有意义的单元——记号(Token...
总之,"用JAVA写的C++词法分析器"项目涵盖了编程语言、编译原理、正则表达式和软件工程等多个领域的知识,对于提升编程技能和理解编译器工作原理具有很高的价值。通过实际操作,开发者可以更深入地理解这两种语言的...