scala / bug

Scala 2 bug reports only. Please, no questions — proper bug reports only.
https://scala-lang.org
232 stars 21 forks source link

Scala parser combinators never use atEnd and sometimes never terminate #5514

Closed scabug closed 12 years ago

scabug commented 12 years ago

Please see code below. It does not terminate even though the expected result is to stop applying rep when reader is depleted.

import scala.io.Source
import scala.util.parsing.combinator.Parsers
import scala.util.parsing.input.Reader
import scala.util.parsing.input.Position

object DemoApp extends App {
    val parsers = new DemoParsers
    val reader = new DemoReader(10)
    val result = parsers.startsWith("s").*(reader)
    Console println result
}

class DemoReader(n: Int) extends Reader[String] {
    def atEnd = n == 0
    def first = "s" + n
    def rest = new DemoReader(n - 1)
    def pos = new Position { def line = 0; def column = 0; def lineContents = first }
}

class DemoParsers extends Parsers {
    type Elem = String
    def startsWith(prefix: String) = acceptIf(_ startsWith prefix)("Error: " + _)
}
scabug commented 12 years ago

Imported From: https://issues.scala-lang.org/browse/SI-5514?orig=1 Reporter: Tymur Porkuian (fixpoint) Affected Versions: 2.9.1