@iAn и @mats:
я ничего не "разъединил" бы в наконец {}, который был "настроен" в рамках попытки {}, как правило. Было бы лучше для получения по запросу потокового создания за пределами попытки {}. Если необходимо обработать исключение, в действии создают, это могло бы быть сделано в большем объеме.
StreamReader stream = new StreamReader("foo.bar");
try {
mySendSomethingToStream(stream);
}
catch(noSomethingToSendException e) {
//Swallow this
logger.error(e.getMessage());
}
catch(anotherTypeOfException e) {
//More serious, throw this one back
throw(e);
}
finally {
stream.close();
}
Это действительно просто. Когда вы используете ~
, вы должны понимать, что для отдельных синтаксических анализаторов, которые завершились успешно, нет обратного отслеживания.
Так, например, message
содержит все, что было до двоеточия, поскольку все это приемлемый образец. Далее, properties
- это rep
из property
, для которого требуется propertyName
, но он находит только двоеточие (первый символ не поглощается сообщение
). Итак, propertyName
не работает, а property
терпит неудачу. Теперь, properties
, как уже упоминалось, является rep
, поэтому он завершается успешно с 0 повторениями, что затем приводит к успешному завершению команды
.
Итак, вернемся к parseAll
. Синтаксический анализатор команды
успешно завершил работу, поглотив все, что было до двоеточия. Затем он задает вопрос: мы в конце ввода ( \ z
)? Нет, потому что рядом стоит двоеточие. Итак, он ожидал окончания ввода, но получил двоеточие.
Вам придется изменить регулярное выражение, чтобы оно не использовало последний идентификатор перед двоеточием. Например:
def message = """[\w\d\s\.]+(?![:\w])""".r
Между прочим, когда вы используете def
, вы принудительно переоцениваете выражение. Другими словами, каждый из этих defs создает синтаксический анализатор каждый раз при каждом вызове. Регулярные выражения создаются каждый раз при обработке парсеров, которым они принадлежат. Если вы измените все на val
, вы получите гораздо лучшую производительность.
Помните, эти вещи определяют синтаксический анализатор, они не запускают его. Это parseAll
, запускающий парсер.