2013-08-27 2 views
1

je le Parser simple, Scala suivante:match de Scala en ligne toute

object MainTest extends JavaTokenParsers { 
    def line: Parser[String] = "A" 
    def main(args: Array[String]): Unit = { 
    println(parseAll(line, """AB""".stripMargin)) 
    } 
} 

Je voudrais ce type pour traiter une ligne (dans ce cas, « AB ») et renvoie une erreur si la ligne ne correspond pas à "A" (ou tout autre motif que je donne).

Malheureusement cela ne fonctionne pas avec:

[1.2] failure: string matching regex `\z' expected but `B' found 

AB 
^ 

Le problème est que « A » est adaptée, même si la fin de la ligne n'est pas atteint. Je voudrais faire échouer l'analyseur pour TOUTES les lignes 'AB', de sorte que si je divise l'entrée en lignes, une ligne entière est appariée ou non.

Est-ce possible?

+3

Pourriez-vous essayer pour expliquer comment vous voulez qu'il se comporte un peu plus en détail? J'aimerais aider, mais j'ai du mal à comprendre ce que vous voulez faire. – johanandren

+0

J'ai ajouté quelques explications supplémentaires! –

Répondre

1

Votre analyseur fonctionne. Vous avez juste besoin d'attraper le résultat au lieu de l'envoyer à println. 'A' est apparié, mais 'B' ne l'est pas (puisque '\ z' = 'fin de l'entrée' était attendu) ce qui rend l'ensemble de la correspondance infructueuse.

import scala.util.parsing.combinator.JavaTokenParsers 

object MainTest extends JavaTokenParsers { 
    def line: Parser[String] = "A"      
    def main: Unit = { 
    val result = parseAll(line, """AB""".stripMargin) 
    if(result.successful) println("OK") 
    else println("NOT ok") 
    }           
} 

Note:

def line = "A*B" matchs seulement "A * B"

def line = "A*B".r est une expression rationnelle pour n> = 0 répétitions de 'A' suivi de 'B'