#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 /
не является началом комментария. //
есть.