2017-05-24 3 views
0

J'écris actuellement une Parser qui s'étend JavaTokenParsers dans Scala qui devrait entre autres parse suivantes Grammar:Scala passe Liste des expressions et une autre expression comme une liste à Constructor

list = "[" [ { expr "," } expr ] "]" 

Mon Parser Classe:

class ExpParser extends JavaTokenParsers { 

    def expr: Parser[Expression] = int | list | bool | id 

    [...]  
    private def list: Parser[Liste] = "[" ~> repsep(expr, ",") ~ expr <~ "]" ^^ { 
    case el ~ e => Liste(List(el, e)) 
    }  // error 

    [..] 
} 

object ParseProgram extends ExpParser { 
    def parse(s: String): ParseResult[Expression] = { 
    parseAll(expr, s) 
    } 
} 

Mon cas classe:

sealed trait Expression 
[...] 
case class Liste(l: List[Expression]) extends Expression 
[...] 

J'ai essayé de créer un nouveau List et le transmettre à la Liste Constructor mais je reçois le message suivant d'erreur:

Type mismatch, attendu: Liste [expression], réelle: Liste [Objet]

Alors, comment puis-je passer le list de Expressions que je reçois de repsep(expr, ",") et expression que je reçois de ~ expr comme l'un list à la Liste Constructor?

Répondre

2

repsep(expr, ",") vous donne un Parser[List[Expression]] et est-ce pas assez?

private def list: Parser[Liste] = "[" ~> repsep(expr, ",") <~ "]" ^^ { 
    case el => Liste(el) 
} 

votre analyse syntaxique d'origine signifie d'avoir une liste comme [True,FalseTrue], est que ce que vous voulez?

+0

Merci beaucoup, c'est absolument ce que je veux. Je pense que je pensais juste trop compliqué – TheDoctor