2014-12-06 62 views
0

这个代码分析数字和运营商只我需要它来分析字母只,并把其他事情无效我应该做些什么细节我从教程网站得到这段代码,并修改它,但没有结果。词法分析在Java中的字母

 package lexical; 

    public class Tokenizer { 


int pos; 
char[] expression; 

Tokenizer(String expression) { 
    this.expression = expression.toCharArray(); 
    this.pos = 0; 
} 

enum Type { OPERATOR, LITTER, UNKNOWN } 

class Lexeme { 
    String type, token; 
    Lexeme(String type, String token) { 
     this.type = type; 
     this.token = token; 
    } 
} 

Lexeme getNextToken() { 
    StringBuilder token = new StringBuilder(); 
    boolean endOfToken = false; 
    Type type = Type.UNKNOWN; 
    while (!endOfToken && hasMoreTokens()) { 
     while(expression[pos] == ' ' && hasMoreTokens()) 
      pos++; 
     switch (expression[pos]) { 
      case '+': 
      case '-': 
      case '*': 
      case '/': 
       if(type != Type.LITTER) { 
        type = Type.OPERATOR; 
        token.append(expression[pos]); 
        pos++; 
       } 
       endOfToken = true; 
       break; 
      case ' ': 
       endOfToken = true; 
       pos++; 
       break; 
      default: 
       if(Character.isDigit(expression[pos]) || expression[pos] == '.') { 
        token.append(expression[pos]); 
        type = Type.LITTER; 
       } else { 
        System.out.println("Systax error at position: " + pos); 
       } 
       pos++; 
       break; 
     } 
    } 
    return new Lexeme(type.name().toLowerCase(), token.toString()); 
} 

boolean hasMoreTokens() { 
    return pos < expression.length; 
} 

public static void main(String[] args) { 
    String expression = "54+18+5"; 
    Tokenizer tokenizer = new Tokenizer(expression); 
    while (tokenizer.hasMoreTokens()) { 
     Lexeme nextToken = tokenizer.getNextToken(); 
     System.out.print("Type: " + nextToken.type + "\tLexeme: " + nextToken.token + "\n"); 
    } 
} 


} 

回答

0

这里这部分是它正在寻找一个数字, 给出了一个非数字或非周期性质的错误。

if(Character.isDigit(expression[pos]) || expression[pos] == '.') { 
    token.append(expression[pos]); 
    type = Type.LITTER; 
} else { 
    System.out.println("Systax error at position: " + pos); 
} 

字符串可以normallly不放任何东西,所以你只想消除if语句,做

default: 
    token.append(expression[pos]); 

但是,如果你想限制你的字符串中的字符,然后修改,如果条件检查你想要的角色。而不是:

if(Character.isDigit(expression[pos]) || expression[pos] == '.') { 

将其更改为只接受您认为在字符串中有效的字符。例如

if (Character.isAlphabetic(expression[pos]) || expression[pos] == "-") { 

您可能还需要一个新的标识,而不是

type = Type.LITTER; 
+0

我努力,因为你发布你的答案,但没有 你能不能请张贴检查所有字母和什么是所有代码无效 在此先感谢 – user3513220 2014-12-06 14:02:15

+0

什么字符是字母 - 只是AZ,az? – Scooter 2014-12-06 14:18:25

+0

字符是字母a-z – user3513220 2014-12-06 14:55:19

0

我不知道你想怎么处理“A12”或任何部分是字母和数字的一部分。此代码将返回“A”为“A12”

package lexical; 

public class Tokenizer { 

    int pos; 
    char[] expression; 

    Tokenizer(String expression) { 
     this.expression = expression.toCharArray(); 
     this.pos = 0; 
    } 

    enum Type { 

     OPERATOR, ALPHA, UNKNOWN, LITTER, ERROR 
    } 

    class Lexeme { 

     String type, token; 

     Lexeme(String type, String token) { 
      this.type = type; 
      this.token = token; 
     } 
    } 

    Lexeme getNextToken() { 
     StringBuilder token = new StringBuilder(); 
     boolean endOfToken = false; 
     Type type = Type.UNKNOWN; 
     // skip whitespace 
     while (expression[pos] == ' ' && hasMoreTokens()) { 
      pos++; 
     } 

     while (!endOfToken && hasMoreTokens()) { 

      switch (expression[pos]) { 
       case ' ': 
       { 
        endOfToken = true; 
        pos++; 
        break; 
       } 
       default: 
        if (Character.isAlphabetic(expression[pos])) {      
         token.append(expression[pos]); 
         type = Type.ALPHA;      
        } else { 
         System.out.println("Systax error at position: " + pos); 
        } 
        pos++; 
        break; 
      } 
     } 
     return new Lexeme(type.name().toLowerCase(), token.toString()); 
    } 

    boolean hasMoreTokens() { 
     return pos < expression.length; 
    } 

    public static void main(String[] args) { 
     expression = "Hello World"; 
     Tokenizer tokenizer = new Tokenizer(expression); 
     while (tokenizer.hasMoreTokens()) { 
      Lexeme nextToken = tokenizer.getNextToken(); 
      System.out.print("Type: " + nextToken.type + "\tLexeme: " + nextToken.token + "\n"); 
     }   
     expression = "123 ABC A12"; 
     tokenizer = new Tokenizer(expression); 
     while (tokenizer.hasMoreTokens()) { 
      Lexeme nextToken = tokenizer.getNextToken(); 
      System.out.print("Type: " + nextToken.type + "\tLexeme: " + nextToken.token + "\n"); 
     }   
    } 
} 

输出:

Type: alpha Lexeme: Hello 
Type: alpha Lexeme: World 
Systax error at position: 0 
Systax error at position: 1 
Systax error at position: 2 
Type: unknown Lexeme: 
Type: alpha Lexeme: ABC 
Systax error at position: 9 
Systax error at position: 10 
Type: alpha Lexeme: A