Ich versuche, meinem Parser auf der Basis von RegexParsers nicht-backtracking ~> und <~ hinzuzufügen.
RegexParser implementieren implicit def literal(s: String): Parser[String]
Hexe implizit eine Zeichenfolge zu einem Parser tranformieren [String]
jetzt füge ich hinzu:
`object implicits{
implicit class helper[T](parser : Parser[T]) {
def ~>! [U](q: => Parser[U]): Parser[U] = parser ~! q ^^ {case a ~ b => b} named ("~>!")
def <~! [U](q: => Parser[U]): Parser[T] = parser ~! q ^^ {case a ~ b => a} named ("<~!")
}
}
Hexe ist meine implizite Klasse.
Aber ich habe eine seltsame Sache gesehen
def groupe : Parser[Group] = "group(" ~>! identifier <~! ")"
Bezeichner ist ein Parser
Hier bekam ich einen Fehler, wenn der String im Klassenparameter übergeben wurde "group(" ~>! identifier
weil das Implizite nicht gemacht wird und der Compiler nach ~> sucht! innerhalb der Zeichenfolge.
aber wenn es im Methodenparameter übergeben wird identifier <~! ")"
die String-> Parser [String] implizite Arbeit.
Ist es ein Scala Bug oder ich vermisse etwas?
Antworten:
1 für die Antwort № 1Es ist kein Bug. Das Problem ist das zu lösen ~>!
auf String
Der Compiler müsste zwei implizite Konvertierungen verketten: von String
zu Parser
und von Parser
zu helper
, das ist nicht erlaubt. Sie müssen also eine direkte Konvertierung von hinzufügen String
zu helper
:
implicit def stringToHelper(s: String): helper[String] = new helper(literal(s))
und auch von Regex
zu helper
Falls benötigt.