2016-02-14 3 views
0

Comment gérer les erreurs avec Grako?Grako - Comment gérer les erreurs?

EBNF (MyGrammar.ebnf):

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

Je générer l'analyseur avec

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

une chaîne vide Parsing et une chaîne "mauvais" (qui n'a pas pu être compensée par la grammaire) résulte à la fois à une fermeture AST vide.

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 = [] 

De plus: Y a-t-il un message d'erreur comme 'foo attendu à la position 123'?

+0

S'il vous plaît fournir la grammaire? – Apalala

+0

Grammaire fournie. – Sebastian

Répondre

1

Pour commencer, la première règle correspond à la chaîne vide. Peut-être vous voulez essayer quelque chose comme:

pattern = { tag | function }+ $ ; 

Oui, l'analyseur généré déclenche une exception si elle ne peut pas analyser la chaîne d'entrée; Notez le $ dans la règle ci-dessus: il indique à l'analyseur qu'il doit voir la fin de l'entrée dans cette position. Sans cela, l'analyseur est heureux de réussir après avoir analysé seulement une partie de l'entrée. Ensuite, je ne pense pas que les éléments nommés dans les éléments nommés produiront les résultats désirés.

Ceci est une version de la grammaire qui peut produire ce que vous voulez:

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

Merci. Le $ est la solution à mon problème. – Sebastian