2008-11-02 57 views
6

我做礁HORSTMANN的组合符解析器练习,我想知道的是代表数字和代表在比赛声明变量字符串字符串来区分的最好方式:斯卡拉组合子解析器 - 数字字符串和变量字符串区分

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ { 
    case a: wholeNumber => Number(a.toInt) 
    case a: String => Variable(a) 
} 

那里的第二行“case a:wholeNumber”不合法。我想过一个正则表达式,但还没有找到一种方法让它与“case”一起工作。

回答

6

我会将它分开一点,并将案例分析推入|。这是一个组合程序,真正LL(*)解析的一般优势之一:

def factor: Parser[ExprTree] = (wholeNumber ^^ { Number(_.toInt) } 
           | "(" ~> expr <~ ")" 
           | ident ^^ { Variable(_) }) 

我道歉,如果你不熟悉的下划线语法。基本上,它只是意味着“用参数代替 th参数到封闭函数值”。因此{ Variable(_) }相当于{ x => Variable(x) }

此处的另一点语法魔术是~><~运营商取代~。这些运算符意味着该术语的解析应包括两个parens的语法,但结果应完全由expr的结果确定。因此,"(" ~> expr <~ ")""(" ~ expr ~ ")"完全相同,但它不需要额外的案例分析即可从expr中检索内部结果值。

+0

非常好!因为我得到了“错误:缺少扩展函数的参数类型”,所以必须将{Number(_。toInt)}更改为{x:String => Number(x)},然后它就像魅力一样工作。 仍然好奇,如果有一个案例类的方式来解决它虽然。 – 2008-11-03 07:15:53