如题,只是做一个算法的演示,所以并不能识别C语言全部的关键字,像int 等关键字会被识别为标识符。可以按照自己需求自行扩充保留字表。
程序功能:
词法分析器从input文件中读入一小段C语言源程序,以二元式形式按顺序输出所有单词。输出结果在显示器上显示,同时存入output文件中。输入的C语言源程序中的所有标识符都要添加到标识符表id-list中,所有无符号整数都要添加到无符号整数表uint-list中。
程序的输出文件包括: output, id-list, uint-list,
该程序的缺点:由于每读一行都要向输出文件写入,大大影响程序执行速度。有兴趣的可以自行改进啦。
首先词法分析器的输出是以二元组的形式,创建二元组类如下:
public class TableItem {
public String type;
public String value;
public TableItem(String type,String value){
this.type=type;
this.value=value;
}
public TableItem(String type){
this.type=type;
}
}
词法分析器类:
import java.awt.print.Printable;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Machine {//输入一个单词,输出相应判断,如果必要的话加入相应表中
public List<TableItem> resultList;
public String token;
public List<TableItem> reserveTable;//C语言的保留字表
public Machine(){
//只需要将保留字表初始化
reserveTable=new ArrayList<TableItem>();
reserveTable.add(new TableItem("res", "while"));
reserveTable.add(new TableItem("res", "if"));
reserveTable.add(new TableItem("res", "else"));
reserveTable.add(new TableItem("res", "switch"));
reserveTable.add(new TableItem("res", "case"));