Per l'uso in una classe lexer a ha una classe Token
che rappresenta un token di un tipo specifico e il suo valore, mentre i tipi sono definiti dal enum TokenType
in cui ogni token detiene la propria stringa di espressione regolare, anch'essa memorizzata nelle variabili static String
Ora il mio problema è che naturalmente creerei due file separati, uno per Token
e uno per TokenType
e localizzo le stringhe regex in TokenType
, a cui appartengono.
Poiché non è possibile, al momento ho tutti e tre insieme nella classe Token
, ma poi tutto viene trascinato per ogni nuovo oggetto Token
. E non posso davvero pensare ad una ragionevole "classe wrapper" per mettere attorno TokenType
e le sue costanti.
public class Token {
private static final String WHITESPACE_REGEX = "[\s\f\r\n]";
private static final String COMMA_REGEX = WHITESPACE_REGEX + "*," + WHITESPACE_REGEX +
// ...
public enum TokenType {
// can't be defined here...
WHITESPACE(WHITESPACE_REGEX + "+"),
COMMA(COMMA_REGEX),
// ...
// ... or here
public final String pattern;
private TokenType(String pattern) {
this.pattern = pattern;
}
}
private TokenType type;
private String value;
public Token(TokenType type, String value) {
this.type = type;
this.value = value;
}
public TokenType getType() {
return type;
}
public String getValue() {
return value;
}
}