Ich habe einen Parser codiert basierend auf Scala Parser Kombinatoren:Wie können Sie Fehlermeldungen in Scala-Parser-Kombinator-basierten Parsern weiter verbessern?
class SxmlParser extends RegexParsers with ImplicitConversions with PackratParsers {
[...]
lazy val document: PackratParser[AstNodeDocument] =
((procinst | element | comment | cdata | whitespace | text)*) ^^ {
AstNodeDocument(_)
}
[...]
}
object SxmlParser {
def parse(text: String): AstNodeDocument = {
var ast = AstNodeDocument()
val parser = new SxmlParser()
val result = parser.parseAll(parser.document, new CharArrayReader(text.toArray))
result match {
case parser.Success(x, _) => ast = x
case parser.NoSuccess(err, next) => {
tool.die("failed to parse SXML input " +
"(line " + next.pos.line + ", column " + next.pos.column + "):\n" +
err + "\n" +
next.pos.longString)
}
}
ast
}
}
Normalerweise sind die resultierenden Parsing-Fehler-Meldungen sind ziemlich nett. Aber manchmal wird es nur
sxml: ERROR: failed to parse SXML input (line 32, column 1):
`"' expected but `' found
^
Dies geschieht, wenn ein Anführungszeichen nicht geschlossen ist und der Parser erreicht die EOT. Was ich hier sehen möchte, ist (1) welche Produktion der Parser hatte, als er das '' 'erwartete (ich habe mehrere) und (2) wo in der Eingabe diese Produktion zu parsen begann (was ein Indikator dafür ist, wo Zitat ist in der Eingabe.) Weiß jemand, wie ich die Fehlermeldungen verbessern kann und mehr Informationen über den tatsächlichen internen Parsing-Status, wenn der Fehler auftritt (vielleicht etwas wie eine Produktionsregel Stacktrace oder was auch immer hier sinnvoll angegeben werden kann, um besser zu identifizieren die Fehlerstelle). BTW, die über „Zeile 32, Spalte 1“ ist eigentlich die Position EOT und daher nicht von nutzen ist hier natürlich.
Jetzt kann ich bestätigen, dass diese Art und Weise, es zu tun richtig ist (und einfach!). Es funktioniert vollkommen in Ordnung für mich – Vinz
Link zur Verfügung gestellt scheint tot zu sein. – jbx
Danke für die Meldung des Deadlinks, ich fand eine andere Quelle für die gleiche Erklärung. – Vinz