2011-02-03 61 views
1

嘗試解析像GroupParser.parse(「{{a} {{c} {d}}}」的嵌套表達式「) 很多小時後,我現在有下面的snipplet解析{a} ,但失敗scala使用嵌套parens解析

[1.5] failure: ``}'' expected but `{' found 
{{a}{{b}{c}}} 
    ^

sealed abstract class Expr 

case class ValueNode(value:String) extends Expr 

object GroupParser extends StandardTokenParsers { 
    lexical.delimiters ++= List("{","}") 

    def vstring = ident ^^ { case s => ValueNode(s) } 
    def expr = (vstring | parens) 
    def parens:Parser[Expr] = "{" ~> expr <~ "}" 

    def parse(s:String) = { 
     val tokens = new lexical.Scanner(s) 
     phrase(expr)(tokens) 
    } 

} 

任何提示?

+0

貴的問題得到解答? – 2011-02-18 17:08:09

回答

1

表達式可以重複多次?如果是這樣,這會工作:

def expr = (vstring | parens)+ 

但是,目前尚不清楚什麼是你的語法,或者爲什麼你的例子是可以接受的。

0

這解析你給了兩個例子:

import scala.util.parsing.combinator.syntactical._ 

sealed abstract class Expr 

case class ValueNode(value:String) extends Expr 

case class ValueListNode(value:List[Expr]) extends Expr 

object GroupParser extends StandardTokenParsers { 
    lexical.delimiters ++= List("{","}") 

    def vstring = ident ^^ { case s => ValueNode(s) } 
    def parens:Parser[Expr] = "{" ~> (expr) <~ "}" 
    def expr = vstring | parens 

    def exprList:Parser[Expr] = "{" ~> rep1(expr | exprList) <~ "}" ^^ { 
    case l => { 
     ValueListNode(l) 
    } 
    } 

    def anyExpr = expr | exprList 

    def parse(s:String) = { 
    val tokens = new lexical.Scanner(s) 
    phrase(anyExpr)(tokens) 
    } 

    def test(s: String) = { 
    parse(s) match { 
     case Success(tree, _) => 
     println("Tree: " + tree) 
     case e: NoSuccess => Console.err.println(e) 
    } 
    } 

    def main(args: Array[String]) = { 
    test("{a}") 
    test("{{a}}") 
    test("{{a}{{b}{c}}}") 
    } 
} 

具有輸出成功:

Tree: ValueNode(a) 
Tree: ValueNode(a) 
Tree: ValueListNode(List(ValueNode(a), ValueListNode(List(ValueNode(b), ValueNode(c)))))