Ich schreibe einen kleinen Schema-Interpreter in Scala und ich habe Probleme beim Parsen von Listen in Scheme. Mein Code analysiert Listen, die mehrere Zahlen, Bezeichner und boolesche Werte enthalten, aber er erstickt, wenn ich versuche, eine Liste mit mehreren Zeichenfolgen oder Listen zu analysieren. Was vermisse ich?Parsing-Schema mit Scala Parser Kombinator
Hier ist mein Parser:
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}
}
Wie gehen Sie mit Leerzeichen um? – Gabe
Warum brauchst du '^^ {case s => s}'? –
@MJP +1, '^^ {Fall s => s}' kann entfernt werden –