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. [基础]RHEL6下iSCSI客户端挂载配置

    本文根据鸟哥私房菜进行操作:http://linux.vbird.org/linux_enterprise/xen.php?thisscreen=800x600 一.侦测 [root@vhost3 ~ ...

  2. Effective C++ 条款11

    在operator=中处理"自我赋值" 什么是自我赋值,非常明显. 就是自己的值赋值给了自己.以下的代码就是自我赋值: class Widget { public: Widget& ...

  3. jeecms 2012 源码分析(2) 前台栏目页静态化分析

    还是要说到web.xml文件 <welcome-file-list> <welcome-file>index.html</welcome-file> <wel ...

  4. C#实现发送和接收pop3邮件方法

    必须引入Interop.jmail.dll应用 /// <summary>    /// 收取新邮件.不删除老邮件.收取邮件后写入数据库    /// </summary>   ...

  5. JavaScript之apply()和call()的区别

    我 在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示 例,总算是看的有点眉目了,在这里我做如下笔记,希望和 ...

  6. $.ajax传递字符串到后台,后台返回json对象

    var mall = { MallID: $("#createId").val().trim(), MallName: $("#createName").val ...

  7. textContent和innerHtml

    textContent,innerText, 查询或者设置元素的文本内容. textContent如,html: <p>test gogo</p> javascript中: v ...

  8. intellj idea 如何设置类头注释和方法注释

    intellj idea 如何设置类头注释和方法注释           intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从ecl ...

  9. BZOJ 2245: [SDOI2011]工作安排( 费用流 )

    费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...

  10. Hive 入门(转)

    #创建表人信息表  person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DE ...