背景
编译原理实验,基本实现对程序的预处理功能
功能
- 去除部分的“回车符”或者“换行符”
- 去除注释(注释方式是以“//”开头的)
- 去除空格以及部分制表符
- 读取源程序,存储结果代码
完整代码
import java.io.*;
public class bianyiyuanli_preDeal {
public static void main(String[] args) {
int i =0, j = 0, k, l = 0;
int t = 0, m = 0;
int n = 1;
BufferedReader reader=null;
FileWriter fw=null;
//String filePath="C:\\Users\\wangshibo\\Desktop\\2020在家学习\\编译原理\\PL-0-Compiler-master\\testPL0\\testPL1.txt";
//String filePath = "D:\\idea项目文件夹\\testPL1.txt";
try {
//设置编码,防止乱码
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:\\idea项目文件夹\\testPL1.txt"), "gbk");
reader = new BufferedReader(inputStreamReader);
char[] chars = new char[1024];
StringBuffer sb = new StringBuffer();
int youxiaoSting;
while ((youxiaoSting = reader.read(chars)) != -1) {
sb.append(chars, 0, youxiaoSting);
}
char[] charss=new char[sb.length()];
sb.toString().getChars(0,sb.length(),charss,0);
char[] d = new char[sb.length()];
char[] e = new char[sb.length()];
for (k = 0; k < sb.length(); k++) {
//去除空格以及制表符
if ((charss[k] == 32 && charss[k + 1] == 32)||charss[k]==9||charss[k]==11) {
d[j] = (char)32;
l++;
}else {
d[j] = charss[k];
j++;
}
}
// for (char ch : d) {
// System.out.print(ch);
// }
for (k = 0; k < j; k++) {
//去除多余的“换行”或者“回车”
if ((d[k] == 10||d[k] == 13) && (d[k + 1] ==10||d[k + 1] ==13)) {
e[t]=d[k];
} else if (d[k] == 47 && d[k+1] == 47) {//去除注释
int zhushi=k;
while (d[zhushi]!=(char)10 && d[zhushi]!=(char)13 ){
//System.out.println(d[zhushi]!=(char)10);
zhushi++;
k++;
}
k++;
}else {
e[t] = d[k];
t++;
}
}
// for (char ch : e) {
// System.out.print(ch);
// }
java.lang.String str = new java.lang.String(e, 0, t);
System.out.print(str);
fw=new FileWriter("D:\\idea项目文件夹\\testPL12.txt",false);
fw.write(str);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
备注
- 这个是我做实验用,肯定与实际编译器的真正预处理少了很多成分
- 并且这个是我自己打出来的,在处理效率上或许会有些许不足
- 若是这个大家发现有什么不足的地方,请留言指正