编译原理词法分析器(java)版的核心代码

本文介绍了一个基于Java实现的词法分析器核心代码。该词法分析器能够处理包括整数、浮点数、标识符、关键字、运算符等多种类型的输入,并通过状态转换的方式进行词法元素的识别。

编译原理词法分析器(java)版的核心代码

public  void Scan(JMenuItem result,JTextArea ta){
	  int state=$START;//初态为0
			  if(ta.getText().length()==0){
				  JOptionPane.showMessageDialog(this, "处理的事件为空");
			  }
			  else{
				 String string=ta.getText();
				  for (int i = 0; i <string.length(); i++) {
					  boolean flag=true;
					  char ch=string.charAt(i);
				  switch (state) {
				case $START:
					if(isDigit(ch)){
						state=$INT;
					}
					else if(isLetter(ch)){
						state=$ID;
					}
					else if(ch==' '||ch=='\r'||ch=='\n'||ch=='\t'){
						flag=false;
					}
					else if(ch=='!'||ch=='='||ch=='>'||ch=='<'||ch=='+'||ch=='-'||ch=='*'){
						state=$DELIM;
					}
					else if(ch=='/'){
						state=$SLAH;
						flag=false;
					}
					else if(ch=='.'){
						state=$1_2_3;
					}
					else{
						state=$END;
					}
					break;
				case $INT:
					if(!(isDigit(ch))&&ch!='.'){
						state=$END;
						i--;
						flag=false;
					}
					else if(ch=='.'){
						state=$FLOAT;
					}
					break;
				case $FLOAT:
					if(!(isDigit(ch))&&ch!='.'){
						state=$END;
						i--;
						flag=false;
					}
					else if(ch=='.'){
						state=$END;
						i--;
						flag=false;
					}
					break;
				case $ID:
					if(!isLetter(ch)&&!isDigit(ch)){
						state=$END;
						i--;
						flag=false;
					}
					break;
				case $DELIM:
					if(ch!='='&&ch!='+'&&ch!='-'){
						state=$SC;
						i=i-2;
						flag=false;
					}
					else {
						state=$END;
					}
					break;
				case $SC:
					if(ch=='!'||ch=='='||ch=='>'||ch=='<'||ch=='+'||ch=='-'||ch=='/'){
						state=$END;
						flag=false;
					}
					break;
				case $SLAH:
					flag=false;
					if(ch!='*'){
						state=$SC;
						i--;
					}
					else{
						state=$SLAH1;
					}
					break;
				case $SLAH1:
					flag=false;
					if(ch=='*'){
						state=$SLAH2;
					}
					break;
				case $SLAH2:
					flag=false;
					if(ch=='/'){
						state=$END;
					}
					break;
				case $1_2_3:
					if(!isDigit(ch)){
						flag=false;
						state=$END;
						i--;
					}
					break;
				default:
					break;
				}
				  if(flag){
					 queue.add(ch);
				  }
				  if(state==$END){
					  if(!queue.isEmpty()){
					 printToken(queue, table);
					 state=$START;
					  }
				  }
				  }
			  }
			  }
 private void printToken(Queue<Character>queue,JTextArea table) {
	 char[] Token=new char[20];
		int  i=0;
	 clear(Token);
	 while(!(queue.isEmpty())){
			Token[i]=queue.poll();
			i++;
		}
	if(isKW(Token)){
		String s1=String.valueOf(Token).replaceAll("\0", "");
		table.append(new String("("+1+","+"\""+s1+"\""+")"+"\n"));
	}
	else if(isBZF(Token)){
		String s=String.valueOf(Token).replaceAll("\0", "");
		table.append(new String("("+2+","+"\""+s+"\""+")"+"\n"));
	}
	else if(isNum(Token)){
		String s=String.valueOf(Token).replaceAll("\0", "");
		table.append(new String("("+3+","+"\""+s+"\""+")"+"\n"));
	}
	else if(isYSF(Token)){
		String s=String.valueOf(Token).replaceAll("\0", "");
		table.append(new String("("+4+","+"\""+s+"\""+")"+"\n"));
	}
	else if(isSC(Token)){
		String s1=String.valueOf(Token).replaceAll("\0", "");
		table.append(new String("("+5+","+"\""+s1+"\""+")"+"\n"));
	}
}
 private boolean isBZF(char[] token) {//判断是否是标识符
	 String s1=String.valueOf(token).replaceAll("\0", "");
		if(isLetter(s1.charAt(0))||s1.charAt(0)=='_'){
			for (int i = 1; i <s1.length(); i++) {
				if(isLetter(s1.charAt(i))||isDigit(s1.charAt(i))||s1.charAt(0)=='_'){
					return true;
				}
			}
		}
	return false;
}
private boolean isYSF(char[] token) {//判断是否是算术运算符
	 String s1=String.valueOf(token).replaceAll("\0", "");
		int len=YSF.length;
		for (int i = 0; i <len; i++) {
			if(s1.equals(YSF[i]))
				return true;
		}
	return false;
}
private void clear(char[] Token){//清空数组
	 for(int i=0;i<Token.length;i++){
		 Token[i]='\0';
	 }
 }
private boolean isNum(char[] token) {//是否是数字
	String s1=String.valueOf(token).replaceAll("\0", "");
	boolean b=false;
	for (int i = 0; i < s1.length(); i++) {
		if(isDigit(s1.charAt(i))||s1.charAt(i)=='.')
			b=true;
	}
	return b;
}
private boolean isSC(char[] token) {//是否是分界符
	String s1=String.valueOf(token).replaceAll("\0", "");
	int len=SC.length;
	for (int i = 0; i <len; i++) {
		if(s1.equals(SC[i]))
			return true;
	}
	return false;
}
private boolean isKW(char[] token) {//是否是关键字
	String s1=String.valueOf(token).replaceAll("\0", "");
	int len=KW.length;
	for (int i = 0; i <len; i++) {
		if(KW[i].equals(s1))
			return true;
	}
	return false;
}
private boolean isLetter(char ch) {//是否是单个字母
		if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch=='_')
			return true;
		return false;
	}
private boolean isDigit(char ch) {//是否是单个数字
	if(ch>='0'&&ch<='9')
		return true;
	return false;
}
@Override
public void actionPerformed(ActionEvent e) {
	JButton j=(JButton)e.getSource();
	if(j.equals(button)){
		file m=new file();
	     m.saveFile(button, table);
	}
	
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值