Come combinare Regexp e le parole chiave in Scala combinatori parser
-
04-10-2019 - |
Domanda
Ho visto due approcci alla costruzione di parser in Scala.
Il primo è quello di estende dal RegexParsers e definire i modelli di won lessicali. Il problema che vedo con questo è che io non capisco come si tratta di ambiguità di parole chiave. Per esempio, se la mia parola chiave corrisponde lo stesso modello idents, quindi elabora le parole chiave come idents.
Per contrastare questo, ho visto i messaggi come questo che mostrano come utilizzare i StandardTokenParsers per specificare le parole chiave. Ma poi, non capisco come specificare i modelli regexp! Sì, StandardTokenParsers è dotato di "ident", ma non arriva con gli altri ho bisogno (complessi a virgola mobile numero rappresentazioni, specifica stringa modelli letterali e le regole per la fuga, ecc).
Come si ottiene sia la possibilità di specificare le parole chiave e la possibilità di specificare modelli token con le espressioni regolari?
Soluzione
ho scritto parser solo RegexParsers
di derivazione, ma quello che faccio è qualcosa di simile:
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