前言:
主要是供给课程设计“参考”使用
受不了某211计科专业乱来的教学计划,防止学弟学妹们遭受同样的痛苦。
其实多做实验没错,错的是整个专业像shi一样的教学计划,课程分配不合理、课程泛而不精、时间分配得好似领导脑子被门夹掉进shi坑一样。
完整源程序代码:
①GitHub免费(多学学GitHub操作用处多多)
②百度网盘
链接:
https://pan.baidu.com/s/1zArRQHqFCrEJuJc3NH143A?pwd=xx6b
提取码: xx6b
运行截图:
主程序代码如下:
- public class Compiler {
- public void Test() throws IOException{//词法分析主程序
- IsReserve isReserve = new IsReserve();
- GetLetter getLetter = new GetLetter();
- IsDelimiter isDelimiter = new IsDelimiter();
- Analysis isNum = new Analysis();
- IsOperator isOperator = new IsOperator();
- IsRelationship isRelationship = new IsRelationship();
- Write logWrite = new Write();
-
- String type[] = {" 无"," 关键字"," 算术符号"," 关系判断符"," 分界符","常数"," 标识符","常数"};
- //下标识别,0表示无种类,1代表关键字,2代表算术符号,3代表关系运算符,4代表分界符,5代表数字,6代表标识符
- getLetter.read();//读取文件
- String Str1 = null;
- int p = 0,typenum1 = 0;
- int num = 0;
- int sb = 0;
- boolean flag1 = true,flag2 = false;
- int tmp=0;
- String a[]=new String[100];
- int flag = 0;
- while(flag1)
- {
- flag2 = false;//标识关系两个字节的关系运算符
- Str1 = null;//存储提取的一段字符串
- num = 0;//num为0,则没进入到循环,最后进入Analysis
- while(!getLetter.buffer.substring(p,p+1).equals(" ") && !getLetter.buffer.substring(p,p+1).equals("\n"))
- //读取buffer中的字符,直到遇到换行符或者空格
- {
- if(isDelimiter.isdelimiter(getLetter.buffer.substring(p,p+1)) > 0)//遇到分界符
- {
- //sb = 1;
- typenum1 = 4;
- num = isDelimiter.isdelimiter(getLetter.buffer.substring(p,p+1));
- break;
- }
- if(isRelationship.isrelationship(getLetter.buffer.substring(p,p+1)) > 0)//遇到关系运算符
- {
- typenum1 = 3;
- if(isRelationship.isrelationship(getLetter.buffer.substring(p,p+2)) > 0)//遇到两个字节的关系运算符
- {
- flag2 = true;
- num = isRelationship.isrelationship(getLetter.buffer.substring(p,p+2));
- flag=num;
- }
- else//一个字节的关系运算符
- {
- num = isRelationship.isrelationship(getLetter.buffer.substring(p,p+1));
- flag=num;
- }
- break;
- }
- if(isOperator.isoperator(getLetter.buffer.substring(p,p+1)) > 0)//遇到算术运算符号
- {
- typenum1 = 2;
- if(isOperator.isoperator(getLetter.buffer.substring(p,p+2)) > 0)//两字节的算术运算符
- {
- flag2 = true;
- num = isOperator.isoperator(getLetter.buffer.substring(p,p+2));
- flag=num;
- }
- // "=="
- else if(isRelationship.isrelationship(getLetter.buffer.substring(p,p+2))>0)
- {
- flag2 = true;
- num = isRelationship.isrelationship(getLetter.buffer.substring(p,p+2));
- flag=num;
- }
- else//一个字节的算术运算符
- {
- num = isOperator.isoperator(getLetter.buffer.substring(p,p+1));
- flag=num;
- }
- break;
- }
-
- if(getLetter.buffer.substring(p,p+1).equals("#"))//遇到结束符号
- {
- flag1 = false;//flag1表示着是否遇到结束符号
- break;
- }
- if(Str1 == null)//这是为了区别当Str1为null时,使用+=会造成字符串中多处一个null
- Str1 = getLetter.buffer.substring(p,p+1);//空,跳过,下一个
- else
- Str1 += getLetter.buffer.substring(p,p+1);//非空,往下读取
- p++;
-
- }
- //System.out.println(Str1);
- if(Str1 != null)//当提取的字符串不为空时
- {
- isNum.analysis(p,Str1);//分析字符串
- if(isNum.typenum == 1)//遇到关键字
- {
- //System.out.println(getLetter.buffer.charAt(p+1));
- if(Character.isLetter(getLetter.buffer.charAt(p+1)))
- {
- sb=1;//在关键字之后,标识符
- }
- }
- if(isNum.typenum != 5 && isNum.typenum != 1)//防止混入
- {
- //System.out.println("!=5");
- sb = 0;
- }
- else if(isNum.typenum==5)//36进制,数字+字母 或者 字母+数字 识别出已有过字母+数字之后,为标识符
- {
- //System.out.println(sb);
- if(sb == 1)
- {
- //System.out.println("sb="+sb);
- isNum.typenum = 6;//标识符
- sb = 0;
- //System.out.println("sb="+sb);
- }
- else
- {
- for(int i=0;i<tmp;i++)
- {
- if(Str1.equals(a[i]) && Character.isLetter(Str1.charAt(0)))//若字母开头且出现过,标识符
- isNum.typenum=6;//标识符
- }
- }
-
- if(isNum.typenum == 6)//是标识符才存进去
- a[tmp++] = Str1;
- }
- //如果分界符接着字母,则下一个为分界符,p从0开始,故charAt(p+2)
- if(typenum1==4 && Character.isLetter(getLetter.buffer.charAt(p+2)) && Character.isDigit(getLetter.buffer.charAt(p+3)))
- {
- sb = 1;
- }
- else if(isNum.typenum==5)//36进制,数字+字母 或者 字母+数字 识别出已有过字母+数字之后,为标识符
- {
- //System.out.println(sb);
- if(sb == 1)
- {
- //System.out.println("sb="+sb);
- isNum.typenum = 6;
- sb = 0;
- //System.out.println("sb="+sb);
- }
- else
- {
- for(int i=0;i<tmp;i++)
- {
- if(Str1.equals(a[i]) && Character.isLetter(Str1.charAt(0)))//若字母开头且出现过,标识符
- {
- isNum.typenum=6;//标识符
- //num = 20;//标识符:20
- }
- }
- }
-
- if(isNum.typenum == 6)//是标识符才存进去
- a[tmp++] = Str1;
- }
- if(isNum.typenum==1)
- flag = isReserve.isreserve(Str1);//关键字
- else if(isNum.typenum==2 )num=isOperator.isoperator(Str1);//算术符号
- else if(isNum.typenum==3) num = isOperator.isoperator(Str1);//关系符号
- else if(isNum.typenum==4)flag=isDelimiter.isdelimiter(Str1);//
- else if(isNum.typenum==5 || isNum.typenum==7) flag=30;//常数
- else if(isNum.typenum==6) flag=20;//标识符
- logWrite.log(flag+","+Str1+"\n");
- System.out.println(Str1+"\t"+type[isNum.typenum]);
- }
- if(num > 0)//当为特殊符号时(分界符,算术符号,关系运算符)
- {
- if(flag2)//两个字节的关系运算符
- {
- if(typenum1==1) {
- num = isReserve.isreserve(Str1);//关键字
- }
- else if(typenum1==2 )
- {
- num=isOperator.isoperator(getLetter.buffer.substring(p,p+1));//算术符号
- if(num == 31)
- {
- if(getLetter.buffer.substring(p+1,p+2).equals("="))
- {
- num = 32;
- }
- }
- else if(num==37)
- {
- if(getLetter.buffer.substring(p+1,p+2).equals("+"))
- {
- num = 51;//++
- }
- }
- }
- else if(typenum1==3) num = isRelationship.isrelationship(getLetter.buffer.substring(p,p+1));//关系符号
- else if(typenum1==5 || typenum1==7) num=30;//常数
- else if(typenum1==6) num=20;//标识符
- // ++/==
- logWrite.log(num+","+getLetter.buffer.substring(p,p+2)+"\n");
- System.out.println(getLetter.buffer.substring(p,p+2)+"\t"+type[typenum1]);
- p++;
- }
- else
- {
- if(typenum1==2 )
- {
- num=isOperator.isoperator(getLetter.buffer.substring(p,p+1));//算术符号
- if(num == 31)
- {
- if(getLetter.buffer.substring(p+1,p+2).equals("="))
- {
- num = 32;
- }
- }
- }
- else if(typenum1==3) num = isRelationship.isrelationship(getLetter.buffer.substring(p,p+1));//关系符号
- logWrite.log(num+","+getLetter.buffer.substring(p,p+1)+"\n");
- System.out.println(getLetter.buffer.substring(p,p+1)+"\t"+type[typenum1]);
- }
- }
- num = 0;
- flag = 0;
- p++;
- }
- // System.out.println(getLetter.buffer);
- System.out.println("END");
- }
- }
-
-