Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 向分析错误中添加行号而不直接扩展位置_Scala_Parsing_Line Numbers_Parser Combinators - Fatal编程技术网

Scala 向分析错误中添加行号而不直接扩展位置

Scala 向分析错误中添加行号而不直接扩展位置,scala,parsing,line-numbers,parser-combinators,Scala,Parsing,Line Numbers,Parser Combinators,我终于完成了一个解析器,它处理我的DSL并将其转换为我的域对象。现在,我想添加一些适当的错误处理,并希望将行号添加到解析器报告的错误中 我找到的示例和答案似乎表明我必须修改域对象以扩展scala.util.parsing.input.Positional。对于我的案例来说,这个例子有点过于简单,而且由于我缺乏经验,我的案例似乎不太适合这个范例 我的主要问题是,我不希望我的域对象直接扩展位置。它们在程序中的其他地方使用,和解析无关。解析器只是程序的一个扩展,用于创建不同的数据输入方式。此外,我不知

我终于完成了一个解析器,它处理我的DSL并将其转换为我的域对象。现在,我想添加一些适当的错误处理,并希望将行号添加到解析器报告的错误中

我找到的示例和答案似乎表明我必须修改域对象以扩展scala.util.parsing.input.Positional。对于我的案例来说,这个例子有点过于简单,而且由于我缺乏经验,我的案例似乎不太适合这个范例

我的主要问题是,我不希望我的域对象直接扩展位置。它们在程序中的其他地方使用,和解析无关。解析器只是程序的一个扩展,用于创建不同的数据输入方式。此外,我不知道如何处理输出字符串或其他我无法控制的类的情况。还有一个问题是,我的域对象已经扩展了程序的其他对象,我不能简单地以这种方式更改层次结构


在不修改域对象并将其与位置对象耦合的情况下,是否有其他方法可以干净地处理此问题?如果我问了一些与实现traits等有关的琐碎问题,我深表歉意。因为我还是Scala新手

您可以使用Scala.util.matching.Regex.matchiiterator来构建类似的东西

type Token = String

trait TokenIterator extends Iterator[Token] {
  def next: Token
  def hasNext: Boolean
  def pos: Int
}

class Tokenizer(regexStr: String, input: String) {
  val regex = regexStr.r

  def iterator: TokenIterator = new TokenIterator {
    val iter = regex.findAllIn(input)
    var pos = 0
    def next = {
      val n = iter.next
      pos = iter.start
      n
    }
    def hasNext = iter.hasNext
  }
}

val str = "3 + 4 - 5"
val iter = new Tokenizer("""d+|\S+?""", str).iterator

while(iter.hasNext) {
  val token = iter.next
  val pos = iter.pos
  println(pos + ": " + token)
}

但是,如何在解析器中使用它?我有一个大约300行的解析器,相当复杂的BNF。我要做什么改变来整合这个?