Scala解析器组合器:如何解析"if(x)",如果x可以包含")"

Ger*_*mán 1 scala parser-combinators

我试图让这个工作:

def emptyCond: Parser[Cond] = ("if" ~ "(") ~> regularStr <~ ")" ^^ { case s => Cond("",Nil,Nil) }
Run Code Online (Sandbox Code Playgroud)

其中regularStr被定义为接受许多东西,包括")".当然,我希望这是一个可接受的输入:if(foo()).但对于任何if(x),它将")"作为regularStr的一部分,因此这个解析器永远不会成功.

我错过了什么?

编辑:

regularStr不是正则表达式.它定义如下:

  def regularStr = rep(ident | numericLit | decimalLit | stringLit | stmtSymbol) ^^ { case s => s.mkString(" ") }
Run Code Online (Sandbox Code Playgroud)

符号是:

  val stmtSymbol = "*" | "&" | "." | "::" | "(" | ")" | "*" | ">=" | "<=" | "=" | 
               "<" | ">" | "|" | "-" | "," | "^" | "[" | "]" | "?" | ":" | "+" |
               "-=" | "+=" | "*=" | "/=" | "&&" | "||" | "&=" | "|="
Run Code Online (Sandbox Code Playgroud)

我不需要详尽的语言检查,只需要控制结构.所以我真的不在乎if()中的"()"内部是什么,我想接受任何标识符,符号等序列.所以,为了我的目的,即使()))应该是有效的,其中")) "是if的"条件".

Ran*_*ulz 7

正则表达式无法识别具有嵌套的,平衡的结构,如语言(...),[...],{...},等于是你将需要使用进一步上下文作品(未正则表达式)匹配的regularStr部分.

  • 你给出的一个你想接受的例子,`if()))`将成为一个问题.如果对可能出现的内容没有规定,你怎么知道在哪里停止使用令牌?如果整个输入是`if(...)`(其中```是什么),那么你就可以了,但如果你需要继续解析其他结构,那么模糊性是相当大的.我的建议是不要尝试使用真正的解析工具制作廉价/松散的解析器. (2认同)