代码之家  ›  专栏  ›  技术社区  ›  egervari

如何使用scala组合解析器抛出有意义消息的异常?

  •  6
  • egervari  · 技术社区  · 15 年前

    def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ {
        case "-" ~ label ~ columns => new Record(label, columns)
    }
    

    假设在repsep(column,“,”)部分,它们意外地生成了这样一个字符串

    a, b, c, d,
    

    这是无效的,因为它以“,”结尾,这不应该存在。与其让解析器在调用parseAll()时停止,不如让它抛出一个人类可读的有意义的异常?(自定义文本、行号等)

    编辑:好的,我找到了一些有用的东西,但是我对它的可定制性不满意:

    def loadFrom(filename: String) {
        val source = 
            Source.fromFile(filename).getLines.mkString("\n")
        val parseResult = parseAll(tables, source)
        if(!parseResult.successful) {
            throw new TestDataParseException(parseResult.toString)
        }
    }
    

    toString会打印一条好消息,但是当它找到一个空格时,它会打印一些奇怪的东西,比如wanting“\z”(有时在我的IDE中看起来像一个块/正方形)。我宁愿说,“嘿,你忘了一个逗号!”

    行号/列确实以[x.y]的形式打印出来。实际上,我想展示[行:x,列:y],因为人们会更直观地知道这是什么。

    谢谢

    1 回复  |  直到 15 年前
        1
  •  7
  •   Marimuthu Madasamy    15 年前
    parseAll(tables, source) match {
      case Success(ast, _) => //do something
      case NoSuccess(msg, next) => {
            println("Failed at line %s, column %s: %s".format(
                        next.pos.line, next.pos.column, msg))
      }
    }
    
    推荐文章