设计一个词法分析器,使其能对输入的字符串进行词法分析,并输出单词、类别所组成的二元组序列。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.LinkedList;
public class Test1 {
static String[] keyword = {"if","int","for","while","do","return","break","continue"};
static String[] operqtor = {"+","-","*","/","=","<",">","<=",">=","!="};
static String[] separator= {",",";","{","}","(",")"};
public static String txt(File file){
StringBuilder result = new StringBuilder();
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次读一行
result.append(s+System.lineSeparator());
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return result.toString();
}
public static String read(File file){
try{
String string;
int f;
FileReader fi = new FileReader(file);
LinkedList<String> list = new LinkedList<String>();
while((f=fi.read())!=-1){
list.add(""+(char)f);
}
int i=0;
string = "";
while(i<list.size()){
if(list.get(i).charAt(0)<='z'&&list.get(i).charAt(0)>='a'|| list.get(i).charAt(0)<='Z'&& list.get(i).charAt(0)>='a'){
while(list.get(i).charAt(0)<='z'&&list.get(i).charAt(0)>='a'|| list.get(i).charAt(0)<='Z'&& list.get(i).charAt(0)>='a'||list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0'){
string = string + list.get(i);
i++;
}
if(string.length()!=0){
if(searh_key(string)==0)
System.out.println("("+2+","+string+")");
}
}
else if(list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0')
{
while(list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0'){
string = string + list.get(i);
i++;
}
System.out.println("("+3+","+string+")");
}
else if(searh_separator(list.get(i))==1) i++;
else if(searh_operqtor(list.get(i)+list.get(i+1))==1) i=i+2;
else if(searh_operqtor(list.get(i))==1) i++;
else i++;
string="";
}
}catch (Exception e) { System.out.println("\n我去打不开。。好坑。。→_→!\n");}
return null;
}
public static void main(String[] args){
File file = new File("./xxx.txt"); //要打开的文件名,里面是需要分析的源代码
System.out.println("文件内容:\n"+txt(file)+"分析:");
read(file);
}
public static int searh_key(String s){
for( int i=0;i<keyword.length;i++){
if(keyword[i].equals(s)) {
System.out.println("("+1+","+keyword[i]+")");
return 1;
}
}
return 0;
}
public static int searh_separator(String s){
for( int i=0;i<separator.length;i++){
if(separator[i].equals(s)) {
System.out.println("("+4+","+separator[i]+")");
return 1;
}
}
return 0;
}
public static int searh_operqtor(String s){
for( int i=0;i<operqtor.length;i++){
if(operqtor[i].equals(s)) {
System.out.println("("+5+","+operqtor[i]+")");
return 1;
}
}
return 0;
}
}