2013-07-11 13 views
1

я определил некоторые правила с PetitParserDart:Как сбой и выдача исключений, когда правило не может быть полностью сопоставлено, в PetitParserDart?

def("start", ref("rule").separatedBy(char('\n'), includeSeparators: false); 
def("rule", char('(').seq(word().plus()).seq(char(')'))); 

Так следующий текст будет соответствовать:

(aaa) 
(bbbbbb) 

Но если есть некоторые линии не могут совпадать:

(aaaa) 
bbbbb 
(cccccccc 

Как определить грамматики, чтобы они не сбрасывались и генерировали исключения в строке (ccccccccc, но не в строке bbbbb?

Я имею в виду, что это исключает только исключения, когда правило не полностью соответствует. Если ничего не соответствует, оно не будет генерировать исключение.

ответ

1

В любой момент в грамматике вы можете ввести неудовлетворительную анализатор:

failure('This parser always fails at this point'); 

Обычно PetitParser не использовать исключения во время синтаксического анализа, успехи и неудачи обозначены соответствующими Success и Failure контекстов ответов.

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

Parser thrower(String message) { 
    return epsilon().map((value) => throw new IllegalStateException(message)); 
} 

Используя обычные наборщик, то вы можете создать очень точные сообщения об ошибках:

char('(') 
    .seq(word().plus()) 
    .seq(char(')') 
    // causes the parser to continue trying to parse the input 
    .or(failure('something bad happened'))) 

Или с выше помощником:

char('(') 
    .seq(word().plus()) 
    .seq(char(')') 
    // stops parsing altogether and throws an exception 
    .or(thrower('something bad happened'))) 
+0

еще раз спасибо за подробный ответ! – Freewind