2016-02-14 2 views
0

Как справиться с обработкой ошибок с помощью Grako?Grako - Как сделать обработку ошибок?

EBNF (MyGrammar.ebnf):

pattern = { tag | function }* ; 
tag  = tag:("%" name:id "%"); 
function = function:("$" name:id "()"); 
id  = ?/([^\\%$,()=])+/? ; 

Я генерации парсер с

python -m grako --whitespace '' MyGrammar.ebnf > my_parser.py 

Синтаксический пустая строка и "плохой" строку (которая не может быть подкреплялись грамматика) оба результата до пустого закрытия АСТ.

parser = MyGrammarParser() 
ast = parser.parse(u"%test%", rule_name='pattern')  #ast contains something 
ast = parser.parse(u"", rule_name='pattern')   #ast = [] 
ast = parser.parse(u"$bad $test", rule_name='pattern') #ast = [] 

И дополнительно: есть ли сообщение об ошибке, например «ожидаемое foo в позиции 123»?

+0

Просьба представить грамматику? – Apalala

+0

Грамматика предоставляется. – Sebastian

ответ

1

Для начала первое правило соответствует пустой строке. Может быть, вы хотите попробовать что-то вроде:

pattern = { tag | function }+ $ ; 

Да, сгенерированный анализатор вызывает исключение, если он не может разобрать строку ввода; обратите внимание на $ в приведенном выше правиле: он сообщает парсеру, что он должен видеть конец ввода в этом положении. Без него синтаксический анализатор с радостью успеет проанализировать только часть ввода.

Тогда я не думаю, что именованные элементы в именованных элементах будут давать желаемые результаты.

Это версия грамматики, которая может производить то, что вы хотите:

pattern = { tag | function }+ $ ; 
tag  = ("%" tag:id "%"); 
function = ("$" function:id "()"); 
id  = ?/([^\\%$,()=])+/? ; 
+0

Спасибо. $ - решение моей проблемы. – Sebastian

Смежные вопросы