Я пытаюсь заставить это работать:
def emptyCond: Parser[Cond] = ("if" ~ "(") ~> regularStr <~ ")" ^^ { case s => Cond("",Nil,Nil) }
, где normalStr определено для принятия нескольких вещей, включая ")". Конечно, я хочу, чтобы это был приемлемый ввод: if (foo ()) . Но для любого if (x) он принимает символ ")" как часть normalStr , и поэтому этот синтаксический анализатор никогда не завершается успешно.
Чего мне не хватает?
Редактировать
normalStr не является регулярным выражением. Определяется так:
def regularStr = rep(ident | numericLit | decimalLit | stringLit | stmtSymbol) ^^ { case s => s.mkString(" ") }
и символы:
val stmtSymbol = "*" | "&" | "." | "::" | "(" | ")" | "*" | ">=" | "<=" | "=" |
"<" | ">" | "|" | "-" | "," | "^" | "[" | "]" | "?" | ":" | "+" |
"-=" | "+=" | "*=" | "/=" | "&&" | "||" | "&=" | "|="
Мне не нужна исчерпывающая проверка языка, только структуры управления. Так что мне все равно, что внутри "()" в if (), я хочу принять любую последовательность идентификаторов, символов и т. Д. Поэтому для моих целей даже if ())) должно быть допустимо, где "))" - это условие if.