2016-10-10 6 views
0

私は新しい言語用のJavaインタープリタを作成しようとしています。このために、それぞれの文字をトークン化する必要があります。私はJasicがJavaで開発された既に開発されたインタプリタであることを発見しました。私はそれをガイドとして使用しています。トークナイザについては、文字がコメントであることを定義する文のifを変更しようとしています。ここでは、コードは次のようになります。スラッシュを比較しようとするとjavaが文字の比較を認識しないのはなぜですか?

public static List<Token> tokenize(String source) { 
    List<Token> tokens = new ArrayList<Token>(); 
    int n=0; 

    String token = ""; 
    TokenizeState state = TokenizeState.DEFAULT; 

    // Many tokens are a single character, like operators and(). 
    String charTokens = "\n=+-*/<>()"; 
    TokenType[] tokenTypes = { TokenType.LINE, TokenType.EQUALS, 
     TokenType.OPERATOR, TokenType.OPERATOR, TokenType.OPERATOR, 
     TokenType.OPERATOR, TokenType.OPERATOR, TokenType.OPERATOR, 
     TokenType.LEFT_PAREN, TokenType.RIGHT_PAREN 
    }; 

    // Scan through the code one character at a time, building up the list 
    // of tokens. 
    for (int i = 0; i < source.length(); i++) { 
     char c = source.charAt(i); 
     switch (state) { 
     case DEFAULT: 
      if (charTokens.indexOf(c) != -1) { 
       tokens.add(new Token(Character.toString(c), 
        tokenTypes[charTokens.indexOf(c)])); 
      } else if (Character.isLetter(c)) { 
       token += c; 
       state = TokenizeState.WORD; 
      } else if (Character.isDigit(c)) { 
       token += c; 
       state = TokenizeState.NUMBER; 
      } else if (c == '"') { 
       state = TokenizeState.STRING; 
      } else if (c == '/'){ // This comparision won't work 
       state = TokenizeState.COMMENT; 
      } 
      /* This is how is handled by Jasic 
       that uses a single quote for comments 
      else if (c == '\'') { 
       state = TokenizeState.COMMENT; 
      }*/ 
      break; 

     case WORD: 
     // Here is more code, but not relevant for this question 
} 

私はすでにも、私はこのように、値のみを取得し、それを比較するCharacter.valueOf(c)を使用しようとしました、でも、性格やタイプのハッシュコードを比較してみました:Character.valueOf(c) == '/'が、何も働きました。

私は答えを探しましたが、すべてがバックスラッシュです。だから、私の質問は、なぜそれが動作していないか知っていますか?または私が間違っているのは、ifステートメントが比較を受け入れていないということですか?

+1

あなたはそれが機能していないことをどのように知っていますか? – shmosel

+0

'c == '/''は 'c == '\' ''と同じものにさえいません。コメントアウトされたコードは一重引用符を探します。より新しいコードのためにあなたが意図しているのでしょうか? –

+4

'/'は除算演算子であるため、 'charTokens.indexOf(c)!= -1'テストですでに処理されています。したがって' c'は 'else if'文で'/'になることはありません。また、 '/'はコメントの開始ではなく**です**。 '//'はです。 – Andreas

答えて

0

/は、charTokensおよびtokenTypes変数に従って除算演算子です。

これは、それゆえcはそのelse if文で/なることはありません、それはすでにcharTokens.indexOf(c) != -1テストによって処理されたことを意味します。

さらに、/はコメントの開始ではありません。 //です。

関連する問題