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();
}
}
}
// 补充
if (args.length == 0) {
System.out.println("usage: java Lex <a literal expression>");
System.exit(0);
}
try {
//注意这一句,要使用args
Lex lex = new Lex(args[0]);
...
} catch () {}
看起来还挺复杂的,你可以去找一下.