2025年3月14日 星期五 甲辰(龙)年 月十三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Java

java编写的C语言词法分析器

时间:07-30来源:作者:点击数:41

一个简易的C语言词法分析程序

前言:

主要是供给课程设计“参考”使用

受不了某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");
  • }
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门