Le StreamTokenizer de Java semble être trop gourmand pour identifier les numéros. Il est relativement léger sur les options de configuration, et je n'ai pas trouvé un moyen de le faire faire ce que je veux. Le test suivant passe, IMO montrant un bug dans l'implémentation; ce que j'aimerais vraiment, c'est que le second jeton soit identifié par un mot "20001_to_30000". Des idées?StreamTokenizer divise 001_to_003 en deux jetons; comment puis-je l'empêcher de le faire?
public void testBrokenTokenizer()
throws Exception
{
final String query = "foo_bah 20001_to_30000";
StreamTokenizer tok = new StreamTokenizer(new StringReader(query));
tok.wordChars('_', '_');
assertEquals(tok.nextToken(), StreamTokenizer.TT_WORD);
assertEquals(tok.sval, "foo_bah");
assertEquals(tok.nextToken(), StreamTokenizer.TT_NUMBER);
assertEquals(tok.nval, 20001.0);
assertEquals(tok.nextToken(), StreamTokenizer.TT_WORD);
assertEquals(tok.sval, "_to_30000");
}
FWIW je pouvais utiliser un StringTokenizer à la place, mais il faudrait beaucoup de refactoring.
Je suppose que c'est la raison pour laquelle la plupart des langues interdisent que le premier caractère des identifiants soit un nombre ... –