java 简单的词法分析
package com.seakt.example;
import java.io.*;
import java.lang.String; public class J_Scanner { public String infile;
public String outfile;
public String []key = new String[33];
FileOutputStream out = null; public J_Scanner(String infile,String outfile){ J_Scanner.this.infile = infile;
J_Scanner.this.outfile = outfile;
String[] key_temp = {"","auto","double","int","struct","break","else","long","switch",
"case", "enum","register","typedef","char","extern","return","union","const",
"float","short","unsigned","continue","for","signed","void","default","goto",
"sizeof","volatile","do","if","while","static"};
key = key_temp; try {
out = new FileOutputStream(new File(outfile));
}
catch(IOException e){
e.printStackTrace();
}
} //输出关键字
public void print_key(){
for(int i=0;i<J_Scanner.this.key.length;i++){
System.out.printf("%s\r\n",J_Scanner.this.key[i]);
}
} //读文件
public void readFile() { File file = new File(J_Scanner.this.infile);
BufferedReader reader = null;
try { reader = new BufferedReader(new FileReader(file));
String tempString = null; while ((tempString = reader.readLine()) != null) {
System.out.println(tempString.length());
getToken(tempString); }
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
} //判断是否字符
private boolean isLetter(char ch){
if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)||ch==35||ch==46)
return true;
else
return false;
} //判断是否数字
private boolean isDigit(char ch){
if(ch>=48&&ch<=57)
return true;
else
return false;
} //查找关键字
private int reserve(String s){
for(int i=1;i<33;i++)
if(s==key[i])
return i;
return 0;
} private void getToken(String s) throws IOException{ String str_write=null; int i=0,code;
char ch=' ';
String temp="";
if(s.length()!=0){
ch=s.charAt(i);
}
while(i<s.length()){
//如果是空跳过
while(i<s.length()&&ch==' '){
i++;
ch=s.charAt(i);
}
//是字母
if(isLetter(ch)){
while((isLetter(ch)||isDigit(ch))&&i<s.length()){
temp+=ch;
i++;
if(i<s.length()-1){
ch=s.charAt(i);
}else{
ch=' ';
}
}
i--;
code=reserve(temp);
if(code==0){
str_write = temp+"\t"+"标识符"+"\r\n";
out.write(str_write.getBytes());
temp="";str_write="";
}else{
str_write = temp+"\t"+"关键字"+"\r\n";
out.write(str_write.getBytes());
temp="";str_write="";
}
}else if(isDigit(ch)){
while(isDigit(ch)){
temp+=ch;
i++;
if(i<s.length()-1){
ch=s.charAt(i);
}else{
ch=' ';
}
}
i--; str_write = temp+"\t"+"常数"+"\r\n";
out.write(str_write.getBytes());
temp="";str_write="";
}else if(ch=='='){
i++;
ch=s.charAt(i);
if(ch== '=' ){
str_write = "=="+"\t"+"判断相等"+"\r\n";
out.write(str_write.getBytes());
temp="";str_write="";
}
else{
i--;
str_write = "="+"\t"+"赋值"+"\r\n";
out.write(str_write.getBytes());
temp="";str_write="";
}
}
else if(ch=='+'){
i++;
ch=s.charAt(i);
if(ch=='+')
out.write(("++"+'\t'+"加1"+"\r\n").getBytes());
else{
i--;
out.write(("++"+'\t'+"加号"+"\r\n").getBytes());
}
}
else if(ch=='&'){
i++;
ch=s.charAt(i);
if(ch=='&')
out.write(("&&"+'\t'+"与"+"\r\n").getBytes());
else{
i--;
out.write(("&"+'\t'+"按位与"+"\r\n").getBytes());
}
}
else if(ch=='|'){
i++;
ch=s.charAt(i);
if(ch=='|')
out.write(("||"+'\t'+"或"+"\r\n").getBytes());
else{
i--;
out.write(("|"+'\t'+"按位或"+"\r\n").getBytes());
}
}
else if(ch=='-')
out.write(( (char)ch+'\t'+"减号"+"\r\n").getBytes());
else if(ch==';')
out.write(( (char)ch+'\t'+"分号"+"\r\n").getBytes());
else if(ch=='(')
out.write(( (char)ch+'\t'+"左括号"+"\r\n").getBytes());
else if(ch==')')
out.write(( (char)ch+'\t'+"右括号"+"\r\n").getBytes());
else if(ch=='{')
out.write(( (char)ch+'\t'+"左花括号"+"\r\n").getBytes());
else if(ch=='}')
out.write(( (char)ch+'\t'+"右花括号"+"\r\n").getBytes());
else if(ch=='*'){
i++;
ch=s.charAt(i);
if(ch=='*')
out.write(("**"+'\t'+"运算符"+"\r\n").getBytes());
else{
i--;
out.write(("*"+'\t'+"乘号"+"\r\n").getBytes());
} }
else if(ch=='<'){
i++;
ch=s.charAt(i);
if(ch=='=')
out.write(("<="+'\t'+"小于等于"+"\r\n").getBytes());
else{
i--;
out.write(("<"+'\t'+"小于"+"\r\n").getBytes());
}
}
else if(ch=='>'){
i++;
if(i<s.length()-1){
ch=s.charAt(i);
}else{
ch=' ';
}
if(ch=='=')
out.write((">="+'\t'+"大于等于"+"\r\n").getBytes());
else{
i--;
out.write(("<"+'\t'+"大于"+"\r\n").getBytes());
}
}
else
return; i++;
if(i<s.length()){
ch=s.charAt(i);
}
} } //关闭输出流
public void close_outStream() throws IOException{
J_Scanner.this.out.close();
} }
java 简单的词法分析的更多相关文章
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
- JAVA简单Swing图形界面应用演示样例
JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...
- 多元线性回归----Java简单实现
http://www.cnblogs.com/wzm-xu/p/4062266.html 多元线性回归----Java简单实现 学习Andrew N.g的机器学习课程之后的简单实现. 课程地址:h ...
- java简单数据类型转化
java简单数据类型,有低级到高级为:(byte,short,char)→int→long→float→double (boolean不参与运算转化) 转化可以分为 低级到高级的自动转化 高级到低级的 ...
- 用C语言编写一个简单的词法分析程序
问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
- Java简单聊天室
实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发 ...
- Java简单工厂模式
Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...
随机推荐
- Android图片裁剪之自由裁剪
我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的 ...
- Loading Image
Android doesn’t handle animated gifs, but here’s one way to display an animated loading image that i ...
- js 数组,字符串,JSON,bind, Name
/** * Created by W.J.Chang on 2014/5/23. */ // 判读是否是数组的方法 console.log(Array.isArray(new Array)); con ...
- oracle超过最大游标数异常分析(转贴)
问题描述 Oracle 使用 OPEN_CURSORS 参数指定一个会话一次最多可以打开的游标的数量.超过此数量时,Oracle 将报告 ORA-01000 错误.当此错误传播到 WebLogic S ...
- 如何利用Github Pages展示自己写的项目
接触github很久了,自己搭建过hexo博客,但是对于web项目托管github pages感觉很懵,所以在此总结分享给有需要的亲们. 教程开始: 1.创建一个新库 2.给库命名 3.创建新库后点击 ...
- C#高效导出Excel(IList转DataTable,DataSet)
微软的Excel操作类导出Excel会很慢,此方法简单的把表中内容以字符串的形式写入到Excel中,用到的一个技巧就是"\t". C#中的\t相当于Tab键,写入到Excel中时就 ...
- 一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞
转载自:http://www.blogjava.net/huliqing/archive/2008/04/18/193907.html 对于作Java桌面应用来说,比较烦人的就是安装部署问题,客户端是 ...
- win7(32 bit) 环境下点击打印预览报错解决办法
如题,报错截图如下 : 解决办法如下: 1.关闭系统数据执行保护.具体操作: 在win7 系统命令行中执行如下命令: bcdedit.exe /set {current} nx Alw ...
- socket(套接字)
客户端: 创建套接字(socket) 连接服务器(connect) 通信(send,recv或者write,read) 关闭套接字(closesocket) 示例代码: int main(int ar ...
- STL模板_智能指针概念
一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...