class ParserException extends Exception { public ParserException(String message) { super(message); } }
class Token { public final static int INVALID = -1; public final static int LEFTPARENTHESIS = 0; public final static int RIGHTPARENTHESIS = 1; public final static int ADD = 2; public final static int SUB = 3; public final static int MUL = 4; public final static int DIV = 5; public final static int NUM = 6;
private String content; private int type;
public Token(String content, int type) { this.content = content; this.type = type; }
public String getContent() { return content; }
public double getDoubleValue() { return Double.parseDouble(content); }
public int getType() { return type; } }
public class Lex { private String buffer; private int colNum = 0; private char curChar;
public Lex(String input) { this.buffer = input; curChar = getChar(); }
private char getChar() { char ch = '#'; while(buffer!=null && colNum<buffer.length()) { ch = buffer.charAt(colNum); colNum++; break; }
return ch; }
private void skipBlank() { while(curChar == ' ') curChar = getChar();
}
public Token getToken() throws ParserException { Token tk = null; if(curChar == ' ') skipBlank();
switch(curChar) { case '(': tk = new Token("(",Token.LEFTPARENTHESIS); curChar = getChar(); break; case ')': tk = new Token(")",Token.RIGHTPARENTHESIS); curChar = getChar(); break; case '+': tk = new Token("+",Token.ADD); curChar = getChar(); break; case '-': tk = new Token("-",Token.SUB); curChar = getChar(); break; case '*': tk = new Token("*",Token.MUL); curChar = getChar(); break; case '/': tk = new Token("/",Token.DIV); curChar = getChar(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': tk = parseNumber(); break; case '#': case '=': tk = null; break; default: tk = new Token("Invalid character",Token.INVALID); curChar = getChar(); break; }
return tk; }
private Token parseNumber() throws ParserException { int dotNum = 0; boolean key = true; StringBuffer buf = new StringBuffer(); buf.append(curChar); if(curChar == '.') dotNum++;
while(key) { curChar = getChar(); switch(curChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': buf.append(curChar); continue; case '.': dotNum++; if(dotNum > 1) throw new ParserException("the string inputed error at column:" + colNum); buf.append('.'); continue; default: key = false; continue; } } return new Token(buf.toString(),Token.NUM); } public static void main(String args[]) { try { Lex lex = new Lex(args[0]); while(true) { Token tk = lex.getToken(); if(tk == null) { break; } else System.out.println(tk.getContent()); } } catch(Exception e) { e.printStackTrace(); } } } 
|