То, что вы ищете, называется лексер . лексер разбивает входные данные на фрагменты (называемые токены ), которые вы можете прочитать.
К счастью, ваш лексер довольно прост и может быть написан вручную.Для более сложных лексеров вы можете использовать flex
(как в «Быстром лексическом анализаторе» - не Adobe Flex) или (поскольку вы используете Java) ANTLR (обратите внимание, что ANTLR - это гораздо больше, чем просто лексер).
Просто придумайте список регулярных выражений, по одному для каждого токена, который нужно сопоставить (обратите внимание, что поскольку ваш ввод очень прост, вы, вероятно, можете покончить сэтот список и объединить их все в одно регулярное выражение. Однако для более продвинутых лексеров это помогает сделать одно регулярное выражение для каждого токена), например
\d+
\+
-
*
/
\(
\)
Затем запустите цикл: пока есть еще символыпроанализировал, просмотрите каждое из ваших регулярных выражений и попытайтесь сопоставить их с началом строки.Если они совпадают, добавьте первую найденную группу в список ввода.В противном случае продолжайте сопоставление (если ни одно из них не соответствует, сообщите пользователю, что у него есть синтаксическая ошибка).
Псевдокод:
List<String>input = new LinkedList<String>();
while(userInputString.length()>0){
for (final Pattern p : myRegexes){
final Matcher m = p.matcher(userInputString);
if(m.find()) {
input.add(m.group());
//Remove the token we found from the user's input string so that we
//can match the rest of the string against our regular expressions.
userInputString=userInputString.substring(m.group().length());
break;
}
}
}
Замечания по реализации:
- Возможно, вы захотите добавить символ
^
ко всем своим регулярным выражениям.Это гарантирует, что вы привязываете свои совпадения к началу строки.Мой псевдокод предполагает, что вы сделали это.