/ Použitie analyzátora regex v podtriede JavaTokensParser - scala, parser-combinators

Pomocou analyzátora regex v podtriede JavaTokensParser - scala, parser-combinators

Snažím sa z kombinácie scala parser s nasledujúcim objektom:

object LogParser extends JavaTokenParsers with PackratParsers {

Niektorí z parserov pracujú. Ale nasledujúci sa dostal do popredia:

 def time  = """([d]{2}:[d]{2}:[d]{2}.[d]+)"""

Nasledujúci vstup nefunguje:

09:58:24.608891

Na dosiahnutie tohto cieľa dostaneme:

[2.22] failure: `([d]{2}:[d]{2}:[d]{2}.[d]+)" expected but `:" found

09:58:24.608891

Poznámka: Overil som správne správanie tohto regexu v rámci repliky scala na rovnakom vstupnom vzore.

val r = """([d]{2}):([d]{2}):([d]{2}.[d]+)""".r
val s = """09:58:24.608891"""

val r(t,t2,t3) = s
t: String = 09
t2: String = 58
t3: String = 24.608891

Takže .. AFA syntaktický analyzátor: existuje problém s vlastným tokenom ":" - t.j. je potrebné vytvoriť vlastný Lexer a pridať ":" na lexical.delimiters?

aktualizovať odpoveď bola poskytnutá na pridanie ".r". Už som to skúsil, ale v každom prípade je to explicitné: toto má rovnaké správanie (nefunguje):

(d) {d} {d} {d} {d} {d}.r

odpovede:

1 pre odpoveď č. 1

Myslím, že len chýbaš .r na konci tu skutočne mať Regex na rozdiel od reťazca literal.

 def time  = """([d]{2}:[d]{2}:[d]{2}.[d]+)"""

to by malo byť

 def time  = """([d]{2}:[d]{2}:[d]{2}.[d]+)""".r

Prvý z nich očakáva, že text bude presne rovnaký ako literárny regexový reťazec (ktorý samozrejme nie je prítomný), druhý očakáva text, ktorý sa skutočne zhoduje s regexom. Parser[String], takže nie je okamžite zrejmé, že niečo chýba.

  • Existuje implicitná konverzia z parametra java.lang.String na Parser [String], takže reťazcové literály môžu byť použité ako parserné kombinátory.
  • Existuje implicitná konverzia z programu scala.util.matching.Regex na> Parser [String], takže výrazy regex môžu byť použité ako syntaktické analyzátory.

http://www.scala-lang.org/files/archive/api/2.11.2/scala-parser-combinators/#scala.util.parsing.combinator.RegexParsers