【发布时间】:2019-02-01 14:15:18
【问题描述】:
所以我正在使用匹配器类并使用它来识别我在枚举中定义的标记。
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 ("[(]"), ERROR("@|#,$,%,^,&.....") 但我不确定实现它的任何现实方法。
感谢您的帮助。 这是完整代码的链接,以防我遗漏任何内容 - https://pastebin.com/jLtnJwgj
【问题讨论】:
标签: java regex pattern-matching lex matcher