无论是词法分析,还是语法分析,给我的第一感觉就是逻辑要严谨。由于项目有自己一套完整的语言和语法,设计好其对应的词法分析器和语法分析器显得尤为重要。

这里给您提供一个免费的java词法分析器下载

java词法分析器实现原理步骤

先写其正则式,然后NFA,然后DFA,然后对其进行优化,最后准备工作做好了,就可以开始写代码了。

下面对其里面的主要函数进行讲解:

enum Token_Type {

keyword =1,              //关键字

Identifier,            //标识符

operatorr,             //运算符

operatorrd,             //单运算符

constant,              //常量

escape,                //转义符

separator,              //界限符

notype,                  //没有类型

zhushi                   //注释类型

};

对其单词的类型定义成枚举。

typedef struct Token {

Token_Type type; //其类型

char *lexeme ;    //字符串

int  value;       //属性值

}Token;

//返回单词的结构。

void InitScanner(char *ch){

fp1 = fopen(ch,"r+");

LineNo = 1;

}//初始化分析器。

void CloseScanner(){

fclose(fp1);

}//关闭分析器

void EmptyTokenString(){

memset(TokenBuffer,0,100);

}//清空缓冲区

static void AddCharTokenString(char Char)

{

int TokenLenth=strlen(TokenBuffer);

if(TokenLenth+1==sizeof(TokenBuffer)) return;

TokenBuffer[TokenLenth]=Char;

TokenBuffer[TokenLenth+1]='\0';

} //将一个字符添加到缓冲区

static char GetChar(){

char Char;

Char = fgetc(fp1);

return Char;

}//从文件中读取一个字符

static void BackChar(char Char) {

if(Char!=EOF){

ungetc(Char,fp1);

}

}//将其字符后退一个。

static Token JudgeKeyToken(char *IDstring);//这个函数实现对关键字进行判断

下面是源代码:

/************************************************************************

*                CopyRight@ice-snow studio                              *

*               email:bingxuefenggu@126.com                             *

*               qq: 405116890                                           *

************************************************************************/

//只考虑到整形常量

//实型没考虑到

//需要解决转义符如何描述的问题

#include

#include

#include

#include

#define TOKEN_LEN 100

enum Token_Type {

keyword =1,              //关键字

Identifier,            //标识符

operatorr,             //运算符

operatorrd,             //单运算符

constant,              //常量

escape,                //转义符

separator,              //界限符

notype,                  //没有类型

zhushi                   //注释类型

};

typedef struct Token {

Token_Type type; //其类型

char *lexeme ;    //字符串

int  value;       //属性值

}Token;

static Token Token_Tap[] = {

{keyword,"abstract",0x103},

{keyword,"boolean",0x103},

{keyword,"break", 0x103},

{keyword,"byte" ,0x103},

{keyword,"case",0x103},

{keyword,"catch",0x103},

{keyword,"char", 0x103},

{keyword, "class",0x103},

{keyword,"const" ,0x103},

{keyword,"continue" ,0x103},

{keyword,"default" , 0x103},

{keyword,"do",0x103},

{keyword,"double",0x103},

{keyword,"else",0x103},

{keyword,"extends",0x103},

{keyword,"false",0x103},

{keyword,"final",0x103},

{keyword,"finally",0x103},

{keyword,"float",0x103},

{keyword,"for",0x103},

{keyword,"goto",0x103},

{keyword,"if",0x103},

{keyword,"implements",0x103},

{keyword,"import",0x103},

{keyword,"instanceof",0x103},

{keyword,"int",0x103},

{keyword,"interface",0x103},

{keyword,"long",0x103},

{keyword,"native",0x103},

{keyword,"new",0x103},

{keyword,"null",0x103},

{keyword,"package",0x103},

{keyword,"private",0x103},

{keyword,"protected",0x103},

{keyword,"public",0x103},

{keyword,"return",0x103},

{keyword,"short",0x103},

{keyword,"static",0x103},

{keyword,"super",0x103},

{keyword,"switch",0x103},

{keyword,"synchronized",0x103},

{keyword,"this",0x103},

{keyword,"throw",0x103},

{keyword,"throws",0x103},

{keyword,"transient",0x103},

{keyword,"true",0x103},

{keyword,"try", 0x103},

{keyword,"void",0x103},

{keyword,"volatile",0x103},

{keyword,"while",0x103},

{constant,"true",0x105},

{constant,"false",0x105}

//以上是所有的关键字

};

FILE *fp1;// 要读文件的描述符

int LineNo;//单词所在的行数

static char TokenBuffer[TOKEN_LEN];//单词符号的缓存区

void InitScanner(char *ch){

fp1 = fopen(ch,"r+");

LineNo = 1;

}

void CloseScanner(){

fclose(fp1);

}

void EmptyTokenString(){

memset(TokenBuffer,0,100);

}

static void AddCharTokenString(char Char)

{

int TokenLenth=strlen(TokenBuffer);

if(TokenLenth+1==sizeof(TokenBuffer)) return;

TokenBuffer[TokenLenth]=Char;

TokenBuffer[TokenLenth+1]='\0';

}

static char GetChar(){

char Char;

Char = fgetc(fp1);

return Char;

}

static void BackChar(char Char) {

if(Char!=EOF){

ungetc(Char,fp1);

}

}

static Token JudgeKeyToken(char *IDstring){

int loop;

Token token;

for(loop=0;loop<51;loop++){

if(strcmp(Token_Tap[loop].lexeme,IDstring)==0)

return Token_Tap[loop];

}

token.type = Identifier;

//strcpy(token.lexeme,IDstring);//youwenti.

token.lexeme = IDstring;

token.value = 0x104;

return token;

}

PC官方版

安卓官方手机版

IOS官方手机版

词法分析器java语言_词法分析器java版(java词法分析器)相关推荐

  1. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  2. java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter6-27

    java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter6-27 自己纯手工,欢迎讨论 package chapter6;public class T27 ...

  3. Java语言程序设计(第3版)沈泽刚主编第5章课后习题答案

    Java语言程序设计(第3版)沈泽刚主编第5章课后习题答案 5.1 编写程序,从键盘输入5个整数,存到一个数组,计算所有元素的最大值,最小值和平均值. import java.util.Scanner ...

  4. java语言的特点简单性,Java语言的特点

    Java是一门面向对象编程语言,底层是C++语言.Java语言分为三大体系: • Java SE(标准版) • Java EE(企业版) • Java ME(微型版) Java语言的特点有以下几种: ...

  5. 《快乐编程大本营》java语言训练班-第4课:java流程控制

    <快乐编程大本营>java语言训练班-第4课:java流程控制 第1节. 顺序执行语句 第2节. 条件分支语句:if条件语句 第3节. 条件分支语句:switch 条件语句 第4节. 条件 ...

  6. mongodb java 开源_开源的Mongodb java client -- mango发布

    Mango  ----   一个非常简单的操作mongodb的小工具,使用java语言,基于mongodb的java driver包. 其主要的灵感来自于Jongo 项目,这是一个非常有创意的工具,将 ...

  7. 帮做Java_代写Heuristics、代做SAT、代写Java语言设计、代做Java代做Prolog|帮做Haskell程序...

    代写Heuristics.代做SAT.代写Java语言设计.代做Java代做Prolog|帮做Haskell程序Heuristics and OptimizationLab assignment #2 ...

  8. 怎样重java初级到java中级_(续)Java进阶之路--从初级菜鸟到高级工程师

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法. 1.一个".java"源文件中是否可以包括 ...

  9. java期末考试试题及答案_(完整word版)java期末考试试题(含答案)

    模拟B卷 考试说明: 1.使用Eclipse编写程序.项目名称为:班级_姓名_学号_卷号.注意:卷号为A或B 2.在项目文件夹下新建一个文本文件,文件名为:答案.txt 3.将编程题外的所有题目写在文 ...

  10. Nginx面试!java语言程序设计第四版,你还看不懂吗?

    第5章 持久化 持久化,Redis的持久化功能有效避免因进程退出造成的数据丢失问题,本章首先介绍RDB和AOF两种持久化配置和运行流程,其次对常见的持久化问题进行定位和优化,最后结合Redis常见的单 ...

最新文章

  1. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
  2. php 跳转qq群代码_PHP小脚本~QQ免KEY值加群
  3. JavaWeb第五讲 Web核心基础之HTTP协议
  4. flutter打包的app有多大_Flutter原生混合开发
  5. winxp精简版没有IIS的解决办法
  6. c++中unordered_map的坑
  7. 小米回应造车传闻;饿了么就春节“套路”骑手活动致歉;Go 1.16 正式发布 | 极客头条...
  8. 1)session总结
  9. php7视频处理扩展_PHP7扩展开发之类型处理
  10. 『号外号外』WoS数据库更新后导入VOSviewer出错的原因
  11. wifi服务器无响应如何修复,wifi打不开怎么修复?wifi打不开原因是什么
  12. Ubuntu20.04下opencv的安装
  13. MATLAB随机数的应用ppt,Matlab生成随机数.ppt
  14. Java角度制向弧度制转化
  15. Android视频录制,保存图片,视频到本地后本地相册或者视频库里面没有的解决方案
  16. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型
  17. linux安卓导航软件下载,五款安卓导航(地图)软件耗电量评测
  18. 1MB有多少字节,1mb有多少个汉字,流量就这样被把握住
  19. C盘被$ESTBAK$占用100G
  20. 微博验证码识别系列三:根据微博验证码图片建立模型

热门文章

  1. 了解并应用数字隔离器的安全限值
  2. 免安装版mysql配置及使用Qt编译驱动
  3. CaffeNet从训练到分类及可视化参数特征 微调
  4. asp.net 母版与ajax使用 updatepanel,ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel...
  5. 计算机flash实训体会与收获,实训收获和心得体会300字
  6. Application 简介 常用方式
  7. Android 反射○
  8. 绕过kernel32自己实现WriteProcessMemory
  9. Exynos4412启动
  10. 网络安全行业的三大方向:为您的职业生涯做好准备