//词法 信息器 Java版
// 导入 io 包
import java.io.BufferedReader;
import java.io.FileReader;
public class Lexical
{
//定义 保留字数组
private String[] keyWord={"if","else","int","for"
,"return","while","do","break","continue",
"printf","scanf","main","%d"} ;
//文件名
private String fileName;
// 定义 动态的 buffer 数组
StringBuffer buffer = new StringBuffer();
// 构造函数
// 词法分析 输入一个文件 url
public Lexical(String fileName)
{
this.fileName=fileName;
}
public static void main(String[] args)
{
//创建 一个 Lexical对象
Lexical lexical= new Lexical("D:/Study/Code/Love/aa.txt");
//调用 文件 读取 函数
lexical.readFile();
//调用 词法分析函数
lexical.analyze();
}
// 判断 是否 为 保留字 每次读取的字符串 ,
boolean isKeyWord(String ch)
{
for(int i=0;i<keyWord.length;i++)
{
if(keyWord[i].equals(ch))
{
return true;
}
}
return false;
}
// 判断 是否 为数字 读取 的 为 字符!
boolean isDigit(char ch)
{
if(ch>=48 &&ch<=57)
{
return true;
}else{
return false;
}
}
// 判断 是否 为字母! 读取的 为 字符
boolean isLetter(char ch)
{
if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)||(ch==37))
{
return true;
}else{
return false;
}
}
// 读取文件 函数
public void readFile()
{
try{
// 创建 FileReader的对象 机读取的文件
FileReader file= new FileReader(this.fileName);
// 创建 BufferReader 的对象 创建 缓冲机制
BufferedReader buf= new BufferedReader(file);
// 定义 一个 临时的字符串 !用于 暂时存放 文件数据!
String temp= null;
while((temp = buf.readLine())!= null)
{
//将读取的 文件 内容追加至 动态的buffer数组中
buffer.append(temp);
}
}catch(Exception e){
System.out.println("文件操作错误!"+ e.toString());
}
}
// 词法分析 函数
public void analyze()
{
int i=0;
char ch;
while(i<buffer.length())
{
ch = buffer.charAt(i);
if(isLetter(ch))
{
//创建一个 字符串的 临时变量 存放字符
StringBuffer temp = new StringBuffer();
//将 字符 扔到 缓冲 临时区
temp.append(ch);
ch=buffer.charAt(++i);
while(isLetter(ch)||isDigit(ch))
{
temp.append(ch);
ch = buffer.charAt(++i);
}
if(isKeyWord(temp.toString()))
{
System.out.println(temp+"为保留字,编码为1!");
}else{
System.out.println(temp+"为标识符,编码为2");
}
}else if((ch==',')||(ch==';')||(ch=='{')||(ch=='}')
||(ch=='(')||(ch==')')||(ch=='/'))
{
System.out.println(ch+"为界符,编码为3");
i++;
}else if(isDigit(ch))
{
StringBuffer temp = new StringBuffer();
while(isDigit(ch)){
temp.append(ch);
ch = buffer.charAt(++i);
}
System.out.println(temp+"为常量,编码为4");
}
else if(ch !=' '){
StringBuffer temp = new StringBuffer();
temp.append(ch);
ch=buffer.charAt(++i);
if((ch=='=')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
{
temp.append(ch);
i++;
}
System.out.println(temp+"为运算符,编码为5");
}else{
i++;
}
}
}
}
// 导入 io 包
import java.io.BufferedReader;
import java.io.FileReader;
public class Lexical
{
//定义 保留字数组
private String[] keyWord={"if","else","int","for"
,"return","while","do","break","continue",
"printf","scanf","main","%d"} ;
//文件名
private String fileName;
// 定义 动态的 buffer 数组
StringBuffer buffer = new StringBuffer();
// 构造函数
// 词法分析 输入一个文件 url
public Lexical(String fileName)
{
this.fileName=fileName;
}
public static void main(String[] args)
{
//创建 一个 Lexical对象
Lexical lexical= new Lexical("D:/Study/Code/Love/aa.txt");
//调用 文件 读取 函数
lexical.readFile();
//调用 词法分析函数
lexical.analyze();
}
// 判断 是否 为 保留字 每次读取的字符串 ,
boolean isKeyWord(String ch)
{
for(int i=0;i<keyWord.length;i++)
{
if(keyWord[i].equals(ch))
{
return true;
}
}
return false;
}
// 判断 是否 为数字 读取 的 为 字符!
boolean isDigit(char ch)
{
if(ch>=48 &&ch<=57)
{
return true;
}else{
return false;
}
}
// 判断 是否 为字母! 读取的 为 字符
boolean isLetter(char ch)
{
if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)||(ch==37))
{
return true;
}else{
return false;
}
}
// 读取文件 函数
public void readFile()
{
try{
// 创建 FileReader的对象 机读取的文件
FileReader file= new FileReader(this.fileName);
// 创建 BufferReader 的对象 创建 缓冲机制
BufferedReader buf= new BufferedReader(file);
// 定义 一个 临时的字符串 !用于 暂时存放 文件数据!
String temp= null;
while((temp = buf.readLine())!= null)
{
//将读取的 文件 内容追加至 动态的buffer数组中
buffer.append(temp);
}
}catch(Exception e){
System.out.println("文件操作错误!"+ e.toString());
}
}
// 词法分析 函数
public void analyze()
{
int i=0;
char ch;
while(i<buffer.length())
{
ch = buffer.charAt(i);
if(isLetter(ch))
{
//创建一个 字符串的 临时变量 存放字符
StringBuffer temp = new StringBuffer();
//将 字符 扔到 缓冲 临时区
temp.append(ch);
ch=buffer.charAt(++i);
while(isLetter(ch)||isDigit(ch))
{
temp.append(ch);
ch = buffer.charAt(++i);
}
if(isKeyWord(temp.toString()))
{
System.out.println(temp+"为保留字,编码为1!");
}else{
System.out.println(temp+"为标识符,编码为2");
}
}else if((ch==',')||(ch==';')||(ch=='{')||(ch=='}')
||(ch=='(')||(ch==')')||(ch=='/'))
{
System.out.println(ch+"为界符,编码为3");
i++;
}else if(isDigit(ch))
{
StringBuffer temp = new StringBuffer();
while(isDigit(ch)){
temp.append(ch);
ch = buffer.charAt(++i);
}
System.out.println(temp+"为常量,编码为4");
}
else if(ch !=' '){
StringBuffer temp = new StringBuffer();
temp.append(ch);
ch=buffer.charAt(++i);
if((ch=='=')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
{
temp.append(ch);
i++;
}
System.out.println(temp+"为运算符,编码为5");
}else{
i++;
}
}
}
}