2010-09-22 20 views
3

J'ai vu deux approches pour construire des analyseurs syntaxiques à Scala. Le premier est de s'étendre à partir de RegexParsers et de définir vos modèles lexicaux gagnés. Le problème que je vois avec ceci est que je ne comprends pas vraiment comment il traite des ambiguïtés de mot-clé. Par exemple, si mon mot clé correspond au même modèle que les mots-clés, il traite les mots-clés en tant qu'identifiants.Comment combiner Regexp et mots-clés dans les combinateurs d'analyseurs Scala

Pour contrer cela, j'ai vu des messages comme this one qui montrent comment utiliser StandardTokenParsers pour spécifier des mots-clés. Mais alors, je ne comprends pas comment spécifier les modèles d'expression rationnelle! Oui, StandardTokenParsers est fourni avec "ident" mais il ne vient pas avec les autres dont j'ai besoin (représentations complexes de nombres à virgule flottante, modèles littéraux de chaînes de caractères spécifiques et règles d'échappement, etc.).

Comment obtenez-vous à la fois la possibilité de spécifier des mots-clés et la possibilité de spécifier des modèles de jetons avec des expressions régulières?

Répondre

8

J'ai écrit que RegexParsers parseurs dérivée de, mais ce que je fais est quelque chose comme ceci:

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 
+0

Je l'avais vu cette suggestion avant et essayé, mais a eu des problèmes où il semblait consommer le jeton qualifié avec le non (...). Mais, je l'ai juste essayé encore et cela fonctionne. Merci! –

+0

Quel est le point de "\ b" dans les expressions rationnelles? Sûrement vous n'encodez pas les backspaces dans votre langue d'entrée?!? –

+0

Corrigé. Je voulais dire une limite de mot. Sinon, vous correspondez à des pseudo-mots-clés qui apparaissent comme le préfixe des identifiants légitimes. –