前言:
主要是供给课程设计“参考”使用
受不了某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");
}
}