Java c语言词法,c语言写的Java词法分析
1.[代码][C/C++]代码
#include
#include
#include
#include
#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("%s\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
{
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;
}
//返回一个字符
//这个字符不为空字符。
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;
}
Java c语言词法,c语言写的Java词法分析相关推荐
- 阅读java文件_阅读与阅读写文件 - Java空格
我想从文件中读取并写入文件.输入文件如下 <0%> As I remember, Adam, it was upon this fashion bequeathed me by will ...
- java程序中my.ini_帮忙写个JAVA 读写ini配置文件小程序!!!!!
展开全部 其实使用 JDK 里面提供的e68a843231313335323631343130323136353331333335306263 Properties 最方便. 相关使用方法可以自己去查 ...
- 写给Java 工程师们一封信
<致 Java 工程师们> 一.写给Java初学者的话 在决定选择走Java开发这条路的过程中,相信大多数同学都会遇到一些困惑,得不到有效的解决,也得不到高手的指点:遇到问题更得不到及时的 ...
- 写出Java的第一个程序
安装JDK 安装jdk,配置Java环境,再通过cmd命令窗口输入Java,Java -version检查是否安装好 写出JAVA的Hello Word 安装好JDK后可以用新建一个text文件,用记 ...
- java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、
五:Java如何做到让机器理解我们想要做的东西 用一个图来描述这个过程会比较容易理解: 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的过程 ...
- java第一个程序编译失败,零基础java第一个程序HelloWorld,编译,环境变量,运行,注释...
1.开发第一个java程序:HelloWorld public class HelloWorld{ // 这是一个类,类名叫做HelloWorld public static void main(St ...
- java的lr词法编译器_Sample语言编译器(词法分析、正规式、LL、LR、 算符优先)...
[实例简介] 重庆理工大学 编译原理 课程设计.用java编写,有漂亮的界面,支持词法分析,正规式转换.LL(1)分析.LR(0)分析.算符优先分析 [实例截图] [核心代码] compiler_2 ...
- c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...
从这四种语言的难度.受欢迎度还有作用以及优点缺点给楼主做一个全面的分析,我们可以从中了解其区别,以及难易程度.至于今后可以用到的或者是前景问题,根据自己的职业发展大家可以自己做个分析.最后会总结一下他 ...
- java和c语言有关联吗_关于JAVA语言,和C语言有什么联系吗?
展开全部 Java语言由语法规则和类库两部分组成,其中语法规则确定了Java程序的书写规范,62616964757a686964616fe59b9ee7ad9431333337626264学习好语法规 ...
最新文章
- android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...
- 数据结构与算法:01 绪论
- 分布式技术比较(RPC,CORBA,WebService)
- ABAP 判断某个或者某段字符串是否为汉字
- ORACLE数据库实现自增的方式
- MySQL limit 优化,百万至千万级快速分页:复合索引
- 还不会子网划分?看这篇文章还远远不够!
- 流浪地球票房43亿元 今起电影最低票价降10元
- Git撤销修改、回退版本相关命令
- 音视频学习(五)——H.264视频码流
- 酷狗歌词Krc批量转换工具Lrc [附转换编码DLL]
- (华师2021年秋季课程作业以及答案3)论述东西方文化差异对建筑风格的影响。
- PLC可编程控制器、单片机开发应用及变频调速综合实训装置
- hal库GPIO函数
- 【数学】小C的作业题
- 为什么你还没有买新能源汽车?
- Excel模板导出并插入图片
- Lustre—配置和管理磁盘配额
- 啊哈添柴挑战Java1016. 反向输出一个三位数
- 集合,ArrayList的运用、 Add()、AddRange()、Clear()、 IndexOf()等
热门文章
- DNS基本概念和相关命令
- codeforces 451C. Predict Outcome of the Game 解题报告
- 2011年最后一小时
- Java算法之旋转数组
- linux编译l和l区别,linux 下 g++编译程序时-I(大写i) 与-L(大写l)-l(小写l) 的作用详解...
- android unity 关闭应用_Unity 之 唤起调用 Android 其它应用app的方法
- python字符串驼峰转换_驼峰风格字符串转换为下滑线风格字符串
- 计算机图形学笔记(第二周)
- HTML如何实现利表自动求和,使用模板标记在html模板中求和
- accessors 作用_@Accessors介绍配置getter和setter