2016-05-24 3 views
0

Я пишу Parser в Скале и застрял в этой точке:Синтаксический в Скале/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 анализаторе - положить function до variable и после cond. В общем случае, когда вы составляете синтаксические анализаторы с использованием альтернативы A | B, тогда синтаксический анализатор A не должен анализировать входные данные, которые являются префиксом ввода, который может быть проанализирован парсером B.

Смежные вопросы