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 简单的词法分析的更多相关文章

  1. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  2. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  3. JAVA简单Swing图形界面应用演示样例

    JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...

  4. 多元线性回归----Java简单实现

    http://www.cnblogs.com/wzm-xu/p/4062266.html 多元线性回归----Java简单实现   学习Andrew N.g的机器学习课程之后的简单实现. 课程地址:h ...

  5. java简单数据类型转化

    java简单数据类型,有低级到高级为:(byte,short,char)→int→long→float→double (boolean不参与运算转化) 转化可以分为 低级到高级的自动转化 高级到低级的 ...

  6. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  7. 预防和避免死锁的方法及银行家算法的java简单实现

    预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...

  8. Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发 ...

  9. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

随机推荐

  1. favicon

    <link rel="icon" href="Images/wangyi.ico" type="text/plain" />

  2. Python之lxml

    作者:Shane 出处:http://bluescorpio.cnblogs.com lxml takes all the pain out of XML. Stephan Richter lxml是 ...

  3. 提高你的Java代码质量吧:使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性. 二.场景 比如,可以通过枚举构造函数声明业务值,定 ...

  4. jjjjQuery选择器

    此文为作者自用复习文章 jQuery选择器: 它不仅继承了CSS选择器简洁的语法, 还继承了其获取页面便捷高效的特点, 它还拥有更加完善的处理机制: 但jQuery选择器获取元素后,为该元素添加的是行 ...

  5. 选项卡 js操作

    html代码展示(这里展示的是关于日程的标签页)css样式这里省略了>>>>自己写的可能更好看 <div class="row"> <ul ...

  6. String字符串需要掌握的几个问题

    一.两种定义方式的区别: String str = "hello";      先在堆内存中查找是否已经有"hello",若有,将str指向已存在的它即可:若堆 ...

  7. poj 1949 Chores 最长路

    题目链接 求出最长路..... #include <iostream> #include <vector> #include <cstdio> #include & ...

  8. poj 3469 Dual Core CPU 最小割

    题目链接 好裸的题....... 两个cpu分别作为源点和汇点, 每个cpu向元件连边, 权值为题目所给的两个值, 如果两个元件之间有关系, 就在这两个元件之间连边, 权值为消耗,这里的边应该是双向边 ...

  9. Docker和DevOps是找工作必备技能

    根据最近的IT Jobs Watch数据,涉及Docker技术的的工作角色上升了317名次,排在500个最受追捧的IT技能第二位.无独有偶,从Rackspace最近的研究表明,Docker和DevOp ...

  10. TCP的阻塞和重传

    TCP的阻塞和重传 TCP的阻塞和重传机制 网络拥堵 现在网络上大部分的网络请求都是以TCP的方式进行传输的了.网络链路是固定的,各种链路情况也是不一样的.网络拥堵一直是TCP协议设计和使用的时候尽力 ...