Маркерная проблема с разделителем синтаксического анализатора Scala

@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();  
}
10
задан Simon Groenewolt 26 November 2009 в 13:16
поделиться

1 ответ

Это действительно просто. Когда вы используете ~ , вы должны понимать, что для отдельных синтаксических анализаторов, которые завершились успешно, нет обратного отслеживания.

Так, например, message содержит все, что было до двоеточия, поскольку все это приемлемый образец. Далее, properties - это rep из property , для которого требуется propertyName , но он находит только двоеточие (первый символ не поглощается сообщение ). Итак, propertyName не работает, а property терпит неудачу. Теперь, properties , как уже упоминалось, является rep , поэтому он завершается успешно с 0 повторениями, что затем приводит к успешному завершению команды .

Итак, вернемся к parseAll . Синтаксический анализатор команды успешно завершил работу, поглотив все, что было до двоеточия. Затем он задает вопрос: мы в конце ввода ( \ z )? Нет, потому что рядом стоит двоеточие. Итак, он ожидал окончания ввода, но получил двоеточие.

Вам придется изменить регулярное выражение, чтобы оно не использовало последний идентификатор перед двоеточием. Например:

def message = """[\w\d\s\.]+(?![:\w])""".r

Между прочим, когда вы используете def , вы принудительно переоцениваете выражение. Другими словами, каждый из этих defs создает синтаксический анализатор каждый раз при каждом вызове. Регулярные выражения создаются каждый раз при обработке парсеров, которым они принадлежат. Если вы измените все на val , вы получите гораздо лучшую производительность.

Помните, эти вещи определяют синтаксический анализатор, они не запускают его. Это parseAll , запускающий парсер.

22
ответ дан 3 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: