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ď č. 1Myslí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.