J'essaye d'écrire un analyseur dans Scala en utilisant des combinateurs d'analyseurs. Si je correspondance récursive,Retour de messages d'erreur significatifs à partir d'un analyseur écrit avec les combinateurs d'analyseurs Scala
def body: Parser[Body] =
("begin" ~> statementList ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
("end" ^^ { _ => List() })|
(statement ~ statementList ^^ { case statement ~ statementList => statement :: statementList })
puis-je obtenir de bons errormessages chaque fois qu'il ya une faute dans un communiqué. Cependant, c'est un code long moche. Je voudrais donc écrire ceci:
def body: Parser[Body] =
("begin" ~> statementList <~ "end" ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
rep(statement)
Ce code fonctionne, mais seulement des messages significatifs si imprimé est il y a une erreur dans la première déclaration. Si elle est dans un communiqué plus tard, le message devient douloureusement inutilisable, car l'analyseur veut voir toute déclaration erronée remplacée par le jeton « end »:
Exception in thread "main" java.lang.RuntimeException: [4.2] error: "end" expected but "let" found
let b : string = x(3,b,"WHAT???",!ERRORHERE!,7)
^
Ma question: est-il un moyen d'obtenir représentant et repsep fonctionnant en combinaison avec des messages d'erreur significatifs, qui placent le curseur sur le bon endroit au lieu de sur le début du fragment répétitif?
'phrase' renvoie un' Parser' que ne réussira que s'il n'y a pas d'entrée après avoir accepté quelque chose. Je ne sais pas pourquoi cela changerait la marche arrière de cette façon, cependant. –
Il s'avère que cela ne change pas du tout le backtracking, mais la phrase a un peu d'état pour vérifier l'échec qui a eu le résultat le plus long. Il est décrit dans un paragraphe intitulé "Error Reporting" dans le chapitre sur les analyseurs dans le livre d'Odersky. – Jan