gpt4 book ai didi

scala - 如何进一步改进基于 Scala 解析器组合器的解析器中的错误消息?

转载 作者:行者123 更新时间:2023-12-04 12:38:16 27 4
gpt4 key购买 nike

我已经编写了一个基于 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位置,因此当然在这里没有用。

最佳答案

我还不知道如何处理(1),但是当我发现这个网页时我也在寻找(2):

https://wiki.scala-lang.org/plugins/viewsource/viewpagesrc.action?pageId=917624

我只是复制信息:

A useful enhancement is to record the input position (line number and column number) of the significant tokens. To do this, you must do three things:

  • Make each output type extend scala.util.parsing.input.Positional
  • invoke the Parsers.positioned() combinator
  • Use a text source that records line and column positions




Finally, ensure that the source tracks positions. For streams, you can simply use scala.util.parsing.input.StreamReader; for Strings, use scala.util.parsing.input.CharArrayReader.



我目前正在使用它,所以我稍后会尝试添加一个简单的示例

关于scala - 如何进一步改进基于 Scala 解析器组合器的解析器中的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906674/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com