📄 scanner.java
字号:
package scanner;
import java.io.*;
import exceptions.*;
public class Scanner {
/**
* the input string
*/
String stream;
/**
* table for identifier
*/
ScannerTable identifier;
/**
* table for relop
*/
ScannerTable relop;
/**
* table for logical
*/
ScannerTable logical;
/**
* table for arithmetic
*/
ScannerTable arith;
/**
* table for number
*/
ScannerTable number;
/**
* table for bool
*/
ScannerTable bool;
/**
* tmp token
*/
Token tmpToken;
/**
* ptr for input stream
*/
int pos=0;
/**
* reprocess the input string
* @throws ExpressionException
*/
private void preprocess() throws ExpressionException{
int i;
boolean flag=false;
String newstr="";
String tstr=stream;
tstr=tstr.replaceAll(" ", "");
if(tstr.equals("$")){
throw new exceptions.EmptyExpressionException();
}
for(i=0;i<stream.length();i++){
if(stream.charAt(i)==' '){
if(!flag){
flag=true;
newstr+=stream.charAt(i);
}
else{
}
}
else if(stream.charAt(i)!='#'){
newstr+=stream.charAt(i);
flag=false;
}
else if(stream.charAt(i)=='#'||i!=stream.length()-1&&stream.charAt(i)=='$'){
throw new exceptions.IllegalSymbolException();
}
}
stream="";
for(i=0;i<newstr.length();i++){
if(newstr.charAt(i)==' '){
// if(i>0&&newstr.length()>1&&newstr.charAt(i+1)>='0'&&newstr.charAt(i+1)<='9'&&newstr.charAt(i-1)>='0'&&newstr.charAt(i-1)<='9'){
stream+='#';
// }
//else{
// }
}
else{
stream+=newstr.charAt(i);
}
}
}
/**
* constructor
* @param Stream input string
* @throws IOException
* @throws ExpressionException
*/
public Scanner(String Stream) throws IOException,ExpressionException
{
stream=Stream+"$";
preprocess();
stream.replaceAll(" ", "");
if(stream.equals("$")){
throw new exceptions.EmptyExpressionException();
}
identifier=new ScannerTable("id.txt");
relop=new ScannerTable("relop.txt");
logical=new ScannerTable("logical.txt");
arith=new ScannerTable("arith.txt");
number=new ScannerTable("number.txt");
bool=new ScannerTable("bool.txt");
}
/**
* get next character
* @return next character(omitting blank)
* @throws ExpressionException
*/
private char getNextChar() throws ExpressionException
{
if(pos>=stream.length())
return '$';
while(stream.charAt(pos)==' '){
pos++;
if(pos>=stream.length())
return '$';
}
pos++;
return stream.charAt(pos-1);
}
/**
* get Identifier
* @return true if identifier got
* @throws ExpressionException
*/
private boolean getId() throws ExpressionException
{
int tmppos=pos;
int state=0;
boolean flag=false;
while(true){
char c=getNextChar();
if(c>='a'&&c<='z'||c>='A'&&c<='Z'){
flag=true;
}
int next=identifier.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
if(flag){
throw new IllegalIdentifierException();
}
return false;
}
else
state=next;
if(identifier.isFinal(state)){
int input=identifier.getReturn(state);
tmpToken=new Token("",0,input,TokenType.getPriority(input));
pos-=identifier.getBackTrack(state);
return true;
}
}
}
/**
* get relop
* @return true if relop got
* @throws ExpressionException
*/
private boolean getRelop() throws ExpressionException
{
int tmppos=pos;
int state=0;
while(true){
char c=getNextChar();
int next=relop.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
return false;
}
else
state=next;
if(relop.isFinal(state)){
int input=relop.getReturn(state);
tmpToken=new Token("",0,input,TokenType.getPriority(input));
pos-=relop.getBackTrack(state);
return true;
}
}
}
/**
* get logical operator
* @return true if logical operator got
* @throws ExpressionException
*/
private boolean getLogic() throws ExpressionException
{
int tmppos=pos;
int state=0;
while(true){
char c=getNextChar();
int next=logical.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
return false;
}
else
state=next;
if(logical.isFinal(state)){
int input=logical.getReturn(state);
tmpToken=new Token("",0,input,TokenType.getPriority(input));
pos-=logical.getBackTrack(state);
return true;
}
}
}
/**
* get arithmetic operator
* @return true if arithmetic operator got
* @throws ExpressionException
*/
private boolean getArith() throws ExpressionException
{
int tmppos=pos;
int state=0;
while(true){
char c=getNextChar();
int next=arith.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
return false;
}
else
state=next;
if(arith.isFinal(state)){
int input=arith.getReturn(state);
tmpToken=new Token("",0,input,TokenType.getPriority(input));
pos-=arith.getBackTrack(state);
return true;
}
}
}
/**
* get number
* @return true if number got
* @throws ExpressionException
*/
private boolean getNumber() throws ExpressionException
{
int tmppos=pos;
int state=0;
boolean flag=false;
while(true){
char c=getNextChar();
int next=number.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
if(flag){
throw new IllegalDecimalException();
}
return false;
}
else{
state=next;
flag=true;
}
if(number.isFinal(state)){
int input=number.getReturn(state);
// System.out.println(stream);
// System.out.println(tmppos+" "+( pos-1));
tmpToken=new Token("",Double.parseDouble(stream.substring(tmppos, pos-1)),input,TokenType.getPriority(input));
pos-=number.getBackTrack(state);
return true;
}
}
}
/**
* get boolean
* @return true if boolean got
* @throws ExpressionException
*/
private boolean getBool() throws ExpressionException
{
int tmppos=pos;
int state=0;
while(true){
char c=getNextChar();
int next=bool.getState(state, c);
// System.out.println(c+" "+next);
if(next<0)
{
pos=tmppos;
return false;
}
else
state=next;
if(bool.isFinal(state)){
int input=bool.getReturn(state);
int tmp=1;
if(stream.charAt(tmppos)=='F'||stream.charAt(tmppos)=='f'){
tmp=0;
}
tmpToken=new Token("",tmp,input,TokenType.getPriority(input));
pos-=bool.getBackTrack(state);
return true;
}
}
}
/**
* get negative
* @return true if negative got
* @throws ExpressionException
*/
private boolean getNeg() throws ExpressionException
{
int tmppos=pos;
int state=0;
char c=getNextChar();
if(c=='-'){
if(pos==1){
tmpToken=new Token("",0,6,TokenType.getPriority(6));
return true;
}
else if(stream.charAt(pos-2)=='#'){
if(pos==2||(stream.charAt(pos-3)!=')'&&('0'>stream.charAt(pos-3)||'9'<stream.charAt(pos-3)))){
tmpToken=new Token("",0,6,TokenType.getPriority(6));
return true;
}
}
else if(stream.charAt(pos-2)!=')'&&('0'>stream.charAt(pos-2)||'9'<stream.charAt(pos-2)))
{
// System.out.println(stream.charAt(pos-1));
tmpToken=new Token("",0,6,TokenType.getPriority(6));
return true;
}
}
pos--;
return false;
}
/**
* get next token
* @return next token
* @throws ExpressionException
*/
public Token getNextToken() throws ExpressionException
{
if(stream.charAt(pos)=='$')
{
tmpToken=new Token("",0,-1,TokenType.getPriority(-1));
// System.out.println(tmpToken.getType());
return tmpToken;
}
if(stream.charAt(pos)=='#'){
pos++;
}
if(getBool())
{
// System.out.println(tmpToken.getType());
return tmpToken;
}
if(getNumber())
{
//System.out.println(tmpToken.getType());
return tmpToken;
}
else if(getNeg()){
// System.out.println(tmpToken.getType());
return tmpToken;
}
if(getId())
{
//System.out.println(tmpToken.getType());
return tmpToken;
}
else if(getRelop()){
// System.out.println(tmpToken.getType());
return tmpToken;
}
else if(getLogic())
{
// System.out.println(tmpToken.getType());
return tmpToken;
}
else if(getArith())
{
// System.out.println(tmpToken.getType());
return tmpToken;
}
throw new exceptions.IllegalSymbolException();
}
static public void main(String []args) throws IOException,ExpressionException
{
Scanner a=new Scanner("max(3,4,5)");
Token t1=a.getNextToken();
System.out.println("op1:"+t1.getType()+" "+t1.getValue());
System.out.println("op2:"+a.getNextToken().getType());
System.out.println("op3:"+a.getNextToken().getType());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -