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)模式.简 ...
随机推荐
- SMTP协议分析
SMTP协议分析 第1章. SMTP概述 1.1. SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所相应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模 ...
- c# 针对不同数据库进行参数化查询
使用参数化 DbCommand 的一个缺点是需要参数的代码将仅适用于支持相同语法的提供程序.OLEDB.SqlClient 和 Oracle 提供程序全部使用不同的语法.例如,用于命名和指定参数的 S ...
- Lambda表达式图解
internal delegate int MyDel(int x); public class Lambda { ; };//匿名方法 ; };//Lambda表达式 ; };//Lambda表达式 ...
- English - 英语学习小笔记
1.It is...to do sth:做某事是.... 解析:It 是形式主语,后面一半接形容词做表语,to do sth是不定式短语作真正主语. 2.make do和make doing是两种表达 ...
- [vc]如何对radio按钮分组
如何使用多组? 多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了.再为对话框添加Radio3和Radio4.很简单,先为这些RadioButton排个顺序,就是排列他们的TABORDER.在对话 ...
- csapp lab3 bufbomb 缓存区溢出攻击 《深入理解计算机系统》
这个实验主要是熟悉栈,和了解数据缓存区溢出的问题. 数据缓存区溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针.在被调用程序里面,栈是向下增长的.所有局部变量 ...
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState()
转载自:http://blog.chinaunix.net/uid-20532101-id-1931929.html 以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的 ...
- nodejs:注册登录session出错以及连接Mongodb数据库时Error connecting to database解决方案
(1)nodejs:注册登录session出错 解决办法: 在app.js 中将var MongoStore = require(connect-mongo')改为var MongoStore = ...
- C# Excel或表格插件
NOPI好像比较好用对WINFORM支持更好! http://www.cnblogs.com/dreamof/archive/2010/06/02/1750151.html NOPI教程 http:/ ...
- [LeetCode]题解(python):140-Word Break II
题目来源: https://leetcode.com/problems/word-break-ii/ 题意分析: 给定一个字符串s和一个字典dict(set),将所有将s有字典dict组成的结果输出. ...