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();
  }
 }
}

解决方案 »

  1.   

    你好像发过一个帖子,有人已经给你解答了。    public static void main(String[] args) {
            // 补充
            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 () {}
      

  2.   

    SUN中国有个JAVA词法分析器,
    看起来还挺复杂的,你可以去找一下.