Почему java не распознает сравнение символов, когда я пытаюсь сравнить косую черту?

#java #if-statement #character #interpreter

#java #if-statement #символ #интерпретатор

Вопрос:

Я пытаюсь создать интерпретатор Java для нового языка, и для этого мне нужно обозначить каждый из символов. Я нашел Jasic, который является уже разработанным интерпретатором, разработанным на Java, поэтому я использую его в качестве руководства. Для токенизатора я пытаюсь изменить if оператор, который определяет, что символ является комментарием. Вот код:

 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. Откуда вы знаете, что это не работает?

2. c == '/' это даже близко не то же самое, что c == ''' . Закомментированный код ищет одинарную кавычку. Это то, что вы собираетесь делать для нового кода?

3. / это оператор деления, поэтому он уже был обработан charTokens.indexOf(c) != -1 тестом, следовательно c , никогда не может быть / в этом else if операторе. Кроме того, a / не является началом комментария. // есть.

4. @shmosel Раньше я System.out.print знал, что это считывает символ, но никогда не вводит оператор, даже если они совпадают.

5. @JimGarrison В исходном коде для начала комментариев использовались одинарные кавычки, я пытаюсь изменить это, чтобы я мог использовать косые черты для комментариев.

Ответ №1:

/ является оператором деления в соответствии с charTokens tokenTypes переменными and .

Это означает, что он уже был обработан charTokens.indexOf(c) != -1 тестом, следовательно c , никогда не может быть / в этом else if операторе.

Кроме того, a / не является началом комментария. // есть.