Frage

Ich habe zwei Ansätze gesehen zu bauen Parser in Scala.

ist der erste von RegexParsers erstreckt sich auf und Ihr gewonnen lexikalische Muster definieren. Das Problem, das ich mit diesem zu sehen ist, dass ich nicht wirklich verstehen, wie es mit Keyword Zweideutigkeiten beschäftigt. Zum Beispiel, wenn mein Stichwort das gleiche Muster wie idents übereinstimmen, verarbeitet es die Schlüsselwörter als idents.

Um das zu begegnen, habe ich Beiträge wie diese gesehen , die zeigen, wie die StandardTokenParsers verwenden Schlüsselwörter angeben. Aber dann, ich verstehe nicht, wie die regexp Muster angeben! Ja, kommt StandardTokenParsers mit „ident“, aber es mit den anderen kommt nicht ich brauche (komplexe Fließkommazahlendarstellungen, spezifische Stringliteral Muster und Regeln für die Flucht, etc).

Wie bekommt man sowohl die Möglichkeit, Schlüsselwörter zu spezifizieren und die Fähigkeit, Token-Muster mit regulären Ausdrücken angeben?

War es hilfreich?

Lösung

Ich habe nur RegexParsers abgeleitete Parser geschrieben, aber was ich tue, ist so etwas wie folgt aus:

val name: Parser[String] = "[A-Z_a-z][A-Z_a-z0-9]*".r

val kwIf: Parser[String]    = "if\\b".r
val kwFor: Parser[String]   = "for\\b".r
val kwWhile: Parser[String] = "while\\b".r

val reserved: Parser[String] = ( kwIf | kwFor | kwWhile )

val identifier: Parser[String] = not(reserved) ~> name
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top