加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在基于Scala parser-combinator的解析器中进一步改进错误消

发布时间:2020-12-16 19:14:51 所属栏目:安全 来源:网络整理
导读:我编写了一个基于 Scala解析器组合器的解析器: class SxmlParser extends RegexParsers with ImplicitConversions with PackratParsers { [...] lazy val document: PackratParser[AstNodeDocument] = ((procinst | element | comment | cdata | whitespace
我编写了一个基于 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.

我正在玩它,所以我稍后会尝试添加一个简单的例子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读