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

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

前言:
主要是供给课程设计“参考”使用
受不了某211计科专业乱来的教学计划,防止学弟学妹们遭受同样的痛苦。
其实多做实验没错,错的是整个专业像shi一样的教学计划,课程分配不合理、课程泛而不精、时间分配得好似领导脑子被门夹掉进shi坑一样。
完整源程序代码:
①CSDN下载:要钱
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");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜菜三菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值