java课的程序实验不难写,但其它和编程有关的实验却很难写,数据结构实验如此,数值分析实验如此,现在学编译原理也如此,当初数据结构的二叉树程序我想都懒得去想,感觉毫无头绪。这次的编译原理上个星期布置的实验,明天要交报告了,今天正好星期天,用了大半天的时间终于被我凑出了结果。结构很乱,尤其是很多重复的代码,没有用到重构,自己看着都不好意思。算了反正写出来了。
import
java.io.
*
;
import
java.util.StringTokenizer;

public
class
test
{
public static int enter_count = 0;
public static int space_count = 0;
public static void main(String args[]){
int i = 0,j = 0,k = 0,n = 0,m = 0;
int count = 0,count1 = 0;
String s1[]=new String[20];
String s2[]=new String[20];
String s3[]=new String[20];
String s4[]=new String[20];
String s5[]=new String[20];
String s6[]=new String[20];
String s7[]=new String[20];
String s8[]=new String[20];
String s9[]=new String[20];
String s10[]=new String[20];
String s11[]=new String[20];
String s12[]=new String[20];
try{
//计算行数
FileInputStream fis = new FileInputStream("myfile.txt");
DataInputStream dis = new DataInputStream(fis);
while(dis.readLine()!=null){
enter_count++;
}
//将每一行符值给一个字符串
fis = new FileInputStream("myfile.txt");//由于上面的dis.readLine()将文件读完了,所以要从新初始化一遍
dis = new DataInputStream(fis);
String s[] = new String[enter_count];
i = 0;
while(dis.available()!=0){
s[i] = dis.readLine();
s1[i]=s[i];
i++;
}
dis.close();
//将每个字符串以空格分割
for(i=0;i<enter_count;i++){
StringTokenizer space = new StringTokenizer(s[i]," ");
space_count = space.countTokens();
while(space.hasMoreTokens()){
s2[n]=space.nextToken();
n++;
j++;
}
j=0;
}
//将每个字符串以"+"号分开
n=0;
for(i=0;i<6;i++){
StringTokenizer space = new StringTokenizer(s2[i],"+",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s3[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count=0;
//s4
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s3[i],"-",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s4[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s5
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s4[i],"*",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s5[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s6
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s5[i],"/",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s6[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s7
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s6[i],"<",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s7[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s8
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s7[i],">",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s8[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s9
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s8[i],"=",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s9[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s10
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s9[i],"(",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s10[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s11
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s10[i],")",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s11[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//s12
n=0;
for(i=0;i<count1;i++){
StringTokenizer space = new StringTokenizer(s11[i],";",true);
space_count = space.countTokens();
while(space.hasMoreTokens()){
s12[n]=space.nextToken();
n++;
j++;
count++;
}
j=0;
}
count1=count;
count = 0;
//去处空格
String s_final[]=new String[count1];
for(i=0;i<count1;i++){
s_final[i]=s12[i].trim();
}
//判断前缀
boolean word=false;
for(i=0;i<count1;i++){
word=false;
//如果是关键字
String keyword[]={"if","then","else","while","do"};
for(j=0;j<5;j++){
if(s_final[i].compareTo(keyword[j])==0){
System.out.println("<"+s_final[i]+","+"->");
word=true;
}
}
//如果是运算符或界符
String operators[]={"+","-","*","/","<",">","=","(",")",";"};
for(j=0;j<10;j++){
if(s_final[i].compareTo(operators[j])==0){
System.out.println("<"+s_final[i]+","+"->");
word=true;
}
}
if(word){
continue;
}
//如果是十进制
if((s_final[i].compareTo("0")==0)||s_final[i].startsWith("1")||s_final[i].startsWith("2")||s_final[i].startsWith("3")||s_final[i].startsWith("4")||s_final[i].startsWith("5")||s_final[i].startsWith("6")||s_final[i].startsWith("7")||s_final[i].startsWith("8")||s_final[i].startsWith("9")){
System.out.println("<1,"+s_final[i]+">");
}
//如果是八进制
if(s_final[i].startsWith("0")&&(!s_final[i].startsWith("0x"))){
System.out.println("<2,"+s_final[i].substring(1)+">");
}
//如果是十六进制
if(s_final[i].startsWith("0x")){
System.out.println("<3,"+s_final[i].substring(2)+">");
}
//如果是标示符
if(s_final[i].startsWith("0")){ }
else{
System.out.println("<0,"+s_final[i]+">");
}
}
}catch(Exception e){
System.err.println("File input error");
}
}
}


























































































































































































































































