J'écris un petit interpréteur de schéma dans Scala et je suis confronté à des problèmes d'analyse de listes dans Scheme. Mon code analyse les listes qui contiennent plusieurs nombres, identificateurs et booléens, mais il s'étouffe si j'essaie d'analyser une liste contenant plusieurs chaînes ou listes. Qu'est-ce que je rate?Schéma d'analyse syntaxique utilisant des combinateurs d'analyseurs Scala
Voici mon analyseur:
class SchemeParsers extends RegexParsers {
// Scheme boolean #t and #f translate to Scala's true and false
def bool : Parser[Boolean] =
("#t" | "#f") ^^ {case "#t" => true; case "#f" => false}
// A Scheme identifier allows alphanumeric chars, some symbols, and
// can't start with a digit
def id : Parser[String] =
"""[a-zA-Z=*+/<>!\?][a-zA-Z0-9=*+/<>!\?]*""".r ^^ {case s => s}
// This interpreter only accepts numbers as integers
def num : Parser[Int] = """-?\d+""".r ^^ {case s => s toInt}
// A string can have any character except ", and is wrapped in "
def str : Parser[String] = '"' ~> """[^""]*""".r <~ '"' ^^ {case s => s}
// A Scheme list is a series of expressions wrapped in()
def list : Parser[List[Any]] =
'(' ~> rep(expr) <~ ')' ^^ {s: List[Any] => s}
// A Scheme expression contains any of the other constructions
def expr : Parser[Any] = id | str | num | bool | list ^^ {case s => s}
}
Comment gérez-vous les espaces? – Gabe
Pourquoi avez-vous besoin de '^^ {case s => s}'? –
@MJP +1, '^^ {case s => s}' peuvent être supprimés –