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词法分析相关推荐

  1. 阅读java文件_阅读与阅读写文件 - Java空格

    我想从文件中读取并写入文件.输入文件如下 <0%> As I remember, Adam, it was upon this fashion bequeathed me by will ...

  2. java程序中my.ini_帮忙写个JAVA 读写ini配置文件小程序!!!!!

    展开全部 其实使用 JDK 里面提供的e68a843231313335323631343130323136353331333335306263 Properties 最方便. 相关使用方法可以自己去查 ...

  3. 写给Java 工程师们一封信

    <致 Java 工程师们> 一.写给Java初学者的话 在决定选择走Java开发这条路的过程中,相信大多数同学都会遇到一些困惑,得不到有效的解决,也得不到高手的指点:遇到问题更得不到及时的 ...

  4. 写出Java的第一个程序

    安装JDK 安装jdk,配置Java环境,再通过cmd命令窗口输入Java,Java -version检查是否安装好 写出JAVA的Hello Word 安装好JDK后可以用新建一个text文件,用记 ...

  5. java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、

    五:Java如何做到让机器理解我们想要做的东西 用一个图来描述这个过程会比较容易理解: 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的过程 ...

  6. java第一个程序编译失败,零基础java第一个程序HelloWorld,编译,环境变量,运行,注释...

    1.开发第一个java程序:HelloWorld public class HelloWorld{ // 这是一个类,类名叫做HelloWorld public static void main(St ...

  7. java的lr词法编译器_Sample语言编译器(词法分析、正规式、LL、LR、 算符优先)...

    [实例简介] 重庆理工大学 编译原理 课程设计.用java编写,有漂亮的界面,支持词法分析,正规式转换.LL(1)分析.LR(0)分析.算符优先分析 [实例截图] [核心代码] compiler_2 ...

  8. c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...

    从这四种语言的难度.受欢迎度还有作用以及优点缺点给楼主做一个全面的分析,我们可以从中了解其区别,以及难易程度.至于今后可以用到的或者是前景问题,根据自己的职业发展大家可以自己做个分析.最后会总结一下他 ...

  9. java和c语言有关联吗_关于JAVA语言,和C语言有什么联系吗?

    展开全部 Java语言由语法规则和类库两部分组成,其中语法规则确定了Java程序的书写规范,62616964757a686964616fe59b9ee7ad9431333337626264学习好语法规 ...

最新文章

  1. android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...
  2. 数据结构与算法:01 绪论
  3. 分布式技术比较(RPC,CORBA,WebService)
  4. ABAP 判断某个或者某段字符串是否为汉字
  5. ORACLE数据库实现自增的方式
  6. MySQL limit 优化,百万至千万级快速分页:复合索引
  7. 还不会子网划分?看这篇文章还远远不够!
  8. 流浪地球票房43亿元 今起电影最低票价降10元
  9. Git撤销修改、回退版本相关命令
  10. 音视频学习(五)——H.264视频码流
  11. 酷狗歌词Krc批量转换工具Lrc [附转换编码DLL]
  12. (华师2021年秋季课程作业以及答案3)论述东西方文化差异对建筑风格的影响。
  13. PLC可编程控制器、单片机开发应用及变频调速综合实训装置
  14. hal库GPIO函数
  15. 【数学】小C的作业题
  16. 为什么你还没有买新能源汽车?
  17. Excel模板导出并插入图片
  18. Lustre—配置和管理磁盘配额
  19. 啊哈添柴挑战Java1016. 反向输出一个三位数
  20. 集合,ArrayList的运用、 Add()、AddRange()、Clear()、 IndexOf()等

热门文章

  1. DNS基本概念和相关命令
  2. codeforces 451C. Predict Outcome of the Game 解题报告
  3. 2011年最后一小时
  4. Java算法之旋转数组
  5. linux编译l和l区别,linux 下 g++编译程序时-I(大写i) 与-L(大写l)-l(小写l) 的作用详解...
  6. android unity 关闭应用_Unity 之 唤起调用 Android 其它应用app的方法
  7. python字符串驼峰转换_驼峰风格字符串转换为下滑线风格字符串
  8. 计算机图形学笔记(第二周)
  9. HTML如何实现利表自动求和,使用模板标记在html模板中求和
  10. accessors 作用_@Accessors介绍配置getter和setter