?? scanner.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 + -