Итак, я использую класс matcher и использую его для идентификации токенов, которые я определил в перечислении.
public static enum TokenType {
// Definitions of accepted tokens
IF("if"), WHILE("while"), PRINT("print"), TYPE("int|string|boolean"), BOOLOP("==|!="), BOOLVAL("false|true"), INTOP("[+]"), CHAR("[a-z]"), DIGIT("[0-9]"), WHITESPACE("[ \t\f\r\n]+"), LPAREN("[(]"), RPAREN("[)]");
public final String pattern;
private TokenType(String pattern) {
this.pattern = pattern;
}
}
public static class Token {
public TokenType type;
public String data;
Моя проблема в том, что мне также нужно идентифицировать все, что не определено в моем шаблоне, и напечатать ошибку, когда это происходит.
Так выглядит моя логика сопоставления
// Begin matching tokens
Matcher matcher = tokenPatterns.matcher(input);
while (matcher.find()) {
if (matcher.group(TokenType.DIGIT.name()) != null) {
tokens.add(new Token(TokenType.DIGIT, matcher.group(TokenType.DIGIT.name())));
continue;
} else if (matcher.group(TokenType.IF.name()) != null) {
tokens.add(new Token(TokenType.IF, matcher.group(TokenType.IF.name())));
continue;
} else if (matcher.group(TokenType.WHILE.name()) != null) {
tokens.add(new Token(TokenType.WHILE, matcher.group(TokenType.WHILE.name())));
continue;
} else if (matcher.group(TokenType.TYPE.name()) != null) {
tokens.add(new Token(TokenType.TYPE, matcher.group(TokenType.TYPE.name())));
continue;
} else if (matcher.group(TokenType.PRINT.name()) != null) {
tokens.add(new Token(TokenType.PRINT, matcher.group(TokenType.PRINT.name())));
continue;
} else if (matcher.group(TokenType.BOOLOP.name()) != null) {
tokens.add(new Token(TokenType.BOOLOP, matcher.group(TokenType.BOOLOP.name())));
continue;
} else if (matcher.group(TokenType.BOOLVAL.name()) != null) {
tokens.add(new Token(TokenType.BOOLVAL, matcher.group(TokenType.BOOLVAL.name())));
continue;
} else if (matcher.group(TokenType.INTOP.name()) != null) {
tokens.add(new Token(TokenType.INTOP, matcher.group(TokenType.INTOP.name())));
continue;
} else if (matcher.group(TokenType.CHAR.name()) != null) {
tokens.add(new Token(TokenType.CHAR, matcher.group(TokenType.CHAR.name())));
continue;
} else if (matcher.group(TokenType.LPAREN.name()) != null) {
tokens.add(new Token(TokenType.LPAREN, matcher.group(TokenType.LPAREN.name())));
continue;
} else if (matcher.group(TokenType.RPAREN.name()) != null) {
tokens.add(new Token(TokenType.RPAREN, matcher.group(TokenType.RPAREN.name())));
continue;
} else if (matcher.group(TokenType.WHITESPACE.name()) != null) {
continue;
}
}
return tokens;
}
Возможным решением было бы добавить к моему шаблону регистр, который учитывает все, что еще не было определено, что будет выглядеть примерно так: WHITESPACE ("[\ t \ f \ r \ n]+ "), LPAREN (" [(] "), ОШИБКА (" @ | #, $,%, ^, & ..... ") , но я не уверен в каком-либо реалистичном способе реализациичто.
Спасибо за любую помощь. Вот ссылка на полный код на случай, если я что-то пропустил - https://pastebin.com/jLtnJwgj