java编写词法分析器
词法分析器就是通过扫描一段程序判断是否是关键字、标识符、常数、分界符、运算符。一般分为一符一种和经典五中;
这里我用的是经典五中,此词法分析器是用java编写的;
/*
保留字|关键字:1
操作符|运算符:2
分界符:3
标识符:4
常数:5
无识别:6
*/
主要代码为:
/**
* 此程序是通过将文件的字符读取到字符数组中去,然后遍历数组,将读取的字符进行
* 分类并输出
* @author
*
*/
public class WordAnalyze {
private String keyWord[] = {"break","include","begin","end","if","else","while","switch"};
private char ch;
//判断是否是关键字
boolean isKey(String str)
{
for(int i = 0;i < keyWord.length;i++)
{
if(keyWord[i].equals(str))
return true;
}
return false;
}
//判断是否是字母
boolean isLetter(char letter)
{
if((letter >= 'a' && letter <= 'z')||(letter >= 'A' && letter <= 'Z'))
return true;
else
return false;
}
//判断是否是数字
boolean isDigit(char digit)
{
if(digit >= '0' && digit <= '9')
return true;
else
return false;
}
//词法分析
void analyze(char[] chars)
{
String arr = "";
for(int i = 0;i< chars.length;i++) {
ch = chars[i];
arr = "";
if(ch == ' '||ch == '\t'||ch == '\n'||ch == '\r'){}
else if(isLetter(ch)){
while(isLetter(ch)||isDigit(ch)){
arr += ch;
ch = chars[++i];
}
//回退一个字符
i--;
if(isKey(arr)){
//关键字
System.out.println(arr+"\t4"+"\t关键字");
}
else{
//标识符
System.out.println(arr+"\t4"+"\t标识符");
}
}
else if(isDigit(ch)||(ch == '.'))
{
while(isDigit(ch)||(ch == '.'&&isDigit(chars[++i])))
{
if(ch == '.') i--;
arr = arr + ch;
ch = chars[++i];
}
//属于无符号常数
System.out.println(arr+"\t5"+"\t常数");
}
else switch(ch){
//运算符
case '+':System.out.println(ch+"\t2"+"\t运算符");break;
case '-':System.out.println(ch+"\t2"+"\t运算符");break;
case '*':System.out.println(ch+"\t2"+"\t运算符");break;
case '/':System.out.println(ch+"\t2"+"\t运算符");break;
//分界符
case '(':System.out.println(ch+"\t3"+"\t分界符");break;
case ')':System.out.println(ch+"\t3"+"\t分界符");break;
case '[':System.out.println(ch+"\t3"+"\t分界符");break;
case ']':System.out.println(ch+"\t3"+"\t分界符");break;
case ';':System.out.println(ch+"\t3"+"\t分界符");break;
case '{':System.out.println(ch+"\t3"+"\t分界符");break;
case '}':System.out.println(ch+"\t3"+"\t分界符");break;
//运算符
case '=':{
ch = chars[++i];
if(ch == '=')System.out.println("=="+"\t2"+"\t运算符");
else {
System.out.println("="+"\t2"+"\t运算符");
i--;
}
}break;
case ':':{
ch = chars[++i];
if(ch == '=')System.out.println(":="+"\t2"+"\t运算符");
else {
System.out.println(":"+"\t2"+"\t运算符");
i--;
}
}break;
case '>':{
ch = chars[++i];
if(ch == '=')System.out.println(">="+"\t2"+"\t运算符");
else {
System.out.println(">"+"\t2"+"\t运算符");
i--;
}
}break;
case '<':{
ch = chars[++i];
if(ch == '=')System.out.println("<="+"\t2"+"\t运算符");
else {
System.out.println("<"+"\t2"+"\t运算符");
i--;
}
}break;
//无识别
default: System.out.println(ch+"\t6"+"\t无识别符");
}
}
}
public static void main(String[] args) throws Exception {
File file = new File("E:\\data.txt");//定义一个file对象,用来初始化FileReader
FileReader reader = new FileReader(file);//定义一个fileReader对象,用来初始化BufferedReader
int length = (int) file.length();
//这里定义字符数组的时候需要多定义一个,因为词法分析器会遇到超前读取一个字符的时候,如果是最后一个
//字符被读取,如果在读取下一个字符就会出现越界的异常
char buf[] = new char[length+1];
reader.read(buf);
reader.close();
new WordAnalyze().analyze(buf); }
}
运行结果:



java编写词法分析器的更多相关文章
- Java编写的C语言词法分析器
Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!
网页动物园2.0发布,经过几个月的努力,采用JAVA编写! 网页动物园2.0 正式发布!游戏发布 游戏名称: 网页动物园插件 游戏来源: 原创插件 适用版本: Discuz! X1.5 - X3.5 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- java 编写hadoop程序中使用第三方libxx.so库
在使用java编写hadoop处理程序时遇到了,java使用依赖的第三方libxx.so库的情况,找到了一种可行的方法,记录一下,希望对别人也有帮助: 加入需要使用的lib库为libxxx.so 1. ...
- 如何用Java编写一段代码引发内存泄露
本文来自StackOverflow问答网站的一个热门讨论:如何用Java编写一段会发生内存泄露的代码. Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有, ...
- delphi调用java编写的webservice
delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{ private stati ...
- 实战WEB 服务器(JAVA编写WEB服务器)
实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报 分类: ...
- Java 编写小程序,下载指定网页上的所有图片
使用Java编写一个小程序,可以根据指定的网页地址,下载网页中的所有图片:使用到网络编程.线程池.IO和UUID的技术.具体代码如下: import java.io.File; import java ...
随机推荐
- 基于 HTML5 Canvas 的工控机柜 U 位动态管理
前言 U 是一种表示服务器外部尺寸的单位,是 unit 的缩略语,详细的尺寸由作为业界团体的美国电子工业协会(EIA)所决定.之所以要规定服务器的尺寸,是为了使服务器保持适当的尺寸以便放在铁质或铝质的 ...
- Java面试与回答技巧(1.如何正确的面试)
在IT行业中,大部分公司很难用有效的方式招到合适的人.直接暴露出来的问题是:・花重金招了一个人,但实际的战斗力还比不上应届毕业生.・招聘了一个知名企业的高管,引入了一些高大上的技术,结果本来稳定的生产 ...
- Effective Java 第三版——39. 注解优于命名模式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- WSL Windows Subsystem for Linux安装指南
见官方文档: https://msdn.microsoft.com/en-us/commandline/wsl/install_guide
- DjangoUeditor项目的集成
DjangoUeditor这个项目,出品人已经不再提供维护支持. 最近在一个使用到aliyun oss的项目里集成了一次这个东西,当然我之前在普通文件上传的北京下已经集成过很多次了. 主要修改的东西就 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- 为什么Python编程被国家教育如此重视?请开始你的表演!
高考新宠 在高考更改之前,提起编程,人们可能更多的会想起c语言之类的. 然而,高考更始之后,Python这门编程说话一夜之间传进了千家万户. 现实上,在IEEE(美国电气电子工程师学会出书的旗舰杂志) ...
- 完全关闭Hyper-v的方法
众所周知Hyper-v和vmware有冲突,开启Hyper-v功能vmware就不能使用,但即使关闭了也是如此,这是因为功能没有被完全关闭,这里整理下方法,我自己在两台机子亲测有效. win+x,a, ...
- Linux文本处理命令 -- grep
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- Spring Cloud Sleuth服务链路追踪(zipkin)(转)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...