2016-05-24 181 views
0

我寫在斯卡拉解析器和被困在這一點上:解析斯卡拉/ Java的

private def expression : Parser[Expression] = cond | variable | integer | liste | function 

    private def cond : Parser[Expression] = "if" ~ predicate ~ "then" ~ expression ~ "else" ~ expression ^^ {case _~i~_~t~_~el => Cond(i,t,el)} 

    private def predicate: Parser[Predicate] = identifier ~ "?" ~ "(" ~ repsep(expression, ",") ~ ")" ^^{case n~_~_~el~_ => Predicate(n,el)} 

    private def function: Parser[Expression] = identifier ~ "(" ~ repsep(expression, ",") ~ ")" ^^{case n~_~el~_ => Function(n,el)} 

    private def liste: Parser[Expression] = "[" ~ repsep(expression, ",") ~ "]" ^^ {case _~ls~_ => Liste(ls)} 

    private def variable: Parser[Expression] = identifier ^^ {case v => Variable(v)} 

    def identifier: Parser[String] = """[a-zA-Z0-9]+""".r  ^^ { _.toString } 

    def integer: Parser[Integer] = num ^^ { case i => Integer(i)} 

    def num: Parser[String] = """(-?\d*)""".r ^^ {_.toString} 

我的問題是,當涉及到一個「表達」的分析器不始終以正確的方式。就像它的funk(x,y)它試圖像解析一個變量螞蟻一樣不像函數。

有什麼想法?

+0

更改'表達式'中的順序。嘗試功能放在變量前面。 – Rumoku

+1

我覺得|||操作能解決嗎? – mstranne

+0

這與[tag:java]有什麼關係? –

回答

0

在您的expression解析器中更改解析器的順序 - 在variable之前和之後放置functioncond之後。一般來說,當您使用替代A | B編寫解析器時,解析器A不應該能夠解析輸入作爲解析器B的可解析輸入的前綴。