Я написал парсер на основе комбинаторов парсеров Scala:
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
}
}
Обычно результирующие сообщения об ошибках синтаксического анализа довольно приятны. Но иногда становится просто
sxml: ERROR: failed to parse SXML input (line 32, column 1):
`"' expected but `' found
^
Это происходит, если символы кавычек не закрываются и парсер достигает EOT. Что я хотел бы здесь увидеть, так это (1) в какой продукции находился синтаксический анализатор, когда он ожидал """ (у меня их несколько) и (2) где на входе эта продукция начала синтаксический анализ (что является индикатором, где вводная цитата находится на входе).Кто-нибудь знает, как я могу улучшить сообщения об ошибках и включить дополнительную информацию о фактическом состоянии внутреннего синтаксического анализа, когда происходит ошибка (возможно, что-то вроде трассировки стека производственного правила или что-то еще, что можно разумно дать здесь, чтобы лучше идентифицировать место ошибки). Кстати, приведенная выше «строка 32, столбец 1» на самом деле является позицией EOT и, следовательно, здесь, конечно, бесполезна.