Günlüğe kaydetme işlevinin yazım için son derece garip olduğunu buluyorum. Gibi neden log(parser)("string")
yapmak zorundayım? Neden parser.log("string")
kadar basit bir şeyiniz yok? Neyse ki üstesinden gelmek için, bunun yerine bu yaptı: sizin ayrıştırıcı Şimdi
trait Logging { self: Parsers =>
// Used to turn logging on or off
val debug: Boolean
// Much easier than having to wrap a parser with a log function and type a message
// i.e. log(someParser)("Message") vs someParser.log("Message")
implicit class Logged[+A](parser: Parser[A]) {
def log(msg: String): Parser[A] =
if (debug) self.log(parser)(msg) else parser
}
}
, karıştırıp edilebilmeki bu özelliğin şöyle:
import scala.util.parsing.combinator.Parsers
import scala.util.parsing.input.CharSequenceReader
object CombinatorParserTest extends App with Parsers with Logging {
type Elem = Char
override val debug: Boolean = true
def notComma: Parser[Char] = elem("not comma", _ != ',')
def notEndLine: Parser[Char] = elem("not end line", x => x != '\r' && x != '\n')
def text: Parser[List[Char]] = rep(notComma.log("notComma") | notEndLine.log("notEndLine"))
val r = text(new CharSequenceReader(","))
println(r)
}
Ayrıca kapatmak için debug
alanını geçersiz kılabilirler eğer istenirse kayıt.
Running bu da ikinci ayrıştırıcı doğru virgül ayrıştırılır gösterir: sağ isterken defalarca defalarca sağlanan görünüyor de ayrıştırılır olduğunu söyleyerek
trying notComma at [email protected]
notComma --> [1.1] failure: not comma expected
,
^
trying notEndLine at [email protected]
notEndLine --> [1.2] parsed: ,
trying notComma at [email protected]
notComma --> [1.2] failure: end of input
,
^
trying notEndLine at [email protected]
notEndLine --> [1.2] failure: end of input
,
^
The result is List(,)
Process finished with exit code 0
Ben EOF yapay olarak uygulanan olduğunu düşünüyorum, ama sen Giriş zaten dizinin sonunda olduğunda ek bir karakter. – huynhjl