私は新しい言語用の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
ステートメントが比較を受け入れていないということですか?
あなたはそれが機能していないことをどのように知っていますか? – shmosel
'c == '/''は 'c == '\' ''と同じものにさえいません。コメントアウトされたコードは一重引用符を探します。より新しいコードのためにあなたが意図しているのでしょうか? –
'/'は除算演算子であるため、 'charTokens.indexOf(c)!= -1'テストですでに処理されています。したがって' c'は 'else if'文で'/'になることはありません。また、 '/'はコメントの開始ではなく**です**。 '//'はです。 – Andreas