⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.java

📁 java版本的词法分析器
💻 JAVA
字号:
//:LexicalAnalyser:Scanner.java
//the class provide the service of analysing the string 

package LexicalAnalyser;

import java.io.*;

class Scanner{
   
   private int currentToken;/*holds the currentToken type to be returned*/
   
   private int state;/*holds the current state*/	
 
   private boolean save;/*flag of the currentString's saving*/
   public boolean newline;
   
   private String currentString;/*lexeme of the identifier or reserved words*/
   
   private String source;//the source string from the source file
  
   public int counter; //the current position in source string
   
   private ReservedTable rtable;
   
   private char c;
Scanner(String source, ReservedTable rtable) 
{
	this.source=source;
	this.rtable=rtable;
	this.counter=0;
}  

   
/*the fuction get the next element of
 *the  source string which stores the  source file*/
public char getNextchar(String s)
 { 
    char t; 
  
    t=s.charAt(counter++);
 	return t;
 	
  	}
 
 /*the fuction backtracks one character in source string*/
 public void ungetNextchar(String s)
 {counter--;}
 
 /****************************************/
/* the primary function of the scanner  */
/****************************************/

public int getToken()
{   
    currentString="";
	state=StateType.START;
	save=false;
	newline=false;
	while(state!=StateType.DONE)
	{   if(counter>=source.length())
		{state=StateType.DONE;
		 break;}
		save=true;
		c=getNextchar(source);
		switch (state)
		{case StateType.START:////////////////////////////state 1
		
			if(isDigit(c))
			state=StateType.INNUM;
			else if(isLetter(c))
			state=StateType.INID;
			else if(c=='=')
			state=StateType.INASSIGN;
			else if(c=='>')
			state=StateType.INLT;
			else if(c=='\n'||c==' ')
			{save=false;
			 if(c=='\n')
			 newline=true;}
			else
		   { state=StateType.DONE;
			 switch(c)
			   { case '+':
			     currentToken=TokenType.PLUS;
			     break;
			     case '-':
			     currentToken=TokenType.MINUS;
			     break;
			     case '*':
			     currentToken=TokenType.TIMES;
			     break;
			     case '(':
			     currentToken=TokenType.LPAREN;
			     break;
			     case ')':
			     currentToken=TokenType.RPAREN;
			     break;
			     case ';':
			     currentToken=TokenType.SEMI;
			     break;
			     case '{':
			     currentToken=TokenType.LCBRACKET;
			     break;
			     case '}':
			     currentToken=TokenType.RCBRACKET;
			     break;
			     default:
			     currentToken=TokenType.ERROR;
			     break;
			 
		    	}
		    }
		
		  break;
		  case StateType.INNUM:///////////////////////////////state 2
		    if(!isDigit(c)){
		    	ungetNextchar(source);
		    	save=false;
		    	state=StateType.DONE;
		    	currentToken=TokenType.NUM;
		    }
		    else{
		    	state=StateType.INNUM;
		    }
		    break;
		  case StateType.INID:////////////////////////////////state 3
		    if(!isLetter(c)&&c!='_'&&!isDigit(c)){
		    	ungetNextchar(source);
		    	save=false;
		    	state=StateType.DONE;
		    	currentToken=TokenType.ID;
		    }
		    else if(c=='_'){
		    	state=StateType.INIDWUL;
		    }
		    else{state=StateType.INID;
		    }
		    break;
		    case StateType.INIDWUL:///////////////////////////state 4
		    if(!isLetter(c)&&!isDigit(c)){
		    	ungetNextchar(source);
		    	save=false;
		    	state=StateType.DONE;
		    	currentToken=TokenType.ID;
		    }
		    else{
		    	state=StateType.INID;
		    }
		    break;
		    case StateType.INASSIGN://////////////////////////state 5
		    if(c=='='){
		      currentToken=TokenType.EQ;
		      state=StateType.DONE;	   
		    }
		    else{
		        ungetNextchar(source);
		    	save=false;
		    	currentToken=TokenType.ASSIGN;
		    	state=StateType.DONE;
		    }
		  break;
		  case StateType.INLT:////////////////////////////////state 6
		  if(c=='='){
		  	currentToken=TokenType.LTE;
		  	state=StateType.DONE;
		  }
		  else{
		  	    ungetNextchar(source);
		    	save=false;
		    	currentToken=TokenType.ASSIGN;
		    	state=StateType.DONE;
		  }
		  break;
		  case StateType.DONE://////////////////////////////state7 & default
		  default:
		  save=false;
		  currentToken=TokenType.ERROR;
		  System.out.println("the bug is caused by:"+state);
		  break;
		 }
	  if(save==true)
	  currentString=currentString+c;
	  
    }////////////////////////////////////////////////////////ending of the while 
    if(state==StateType.DONE)
    return currentToken;
   
   else{
   
   	   System.out.println("the bug happened");
   	   return 0;
   	   }

}

/////////////////////////////////////////////////////////////////
public boolean isDigit(char letter)

{
 return java.lang.Character.isDigit(letter);
   }

public boolean isLetter(char letter)
{return java.lang.Character.isLetter(letter);}
public String returncurrentString()
{return currentString;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -