2016-05-24 6 views
0

で私はScalaでパーサーを書いていますし、この時点で捕まってしまった:解析は、スカラ座/ 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)は、変数antのように解析しないようにしようとします。

+0

'式 'の順序を変更します。変数の前に置く関数を試してください。 – Rumoku

+1

私は|||操作はそれを解決することができますか? – mstranne

+0

これは[tag:java]と何が関係していますか? –

答えて

0

expressionパーサーのパーサーの順番を変更してください。をvariableの前に、そしてcondの後に置き換えてください。通常、代替A | Bを使用してパーサーを構成すると、パーサーAは、パーサーBによって解析可能な入力のプレフィックスである入力を解析できません。