1

我试图让它工作:

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

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

我错过了什么?

编辑

regularStr 不是正则表达式。它是这样定义的:

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

符号是:

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

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

4

2 回答 2

7

正则表达式无法识别具有嵌套、平衡结构(如(...)[...]{...}等)的语言。因此,您将需要使用更多上下文无关的产生式(不是正则表达式)来匹配这些regularStr部分。

于 2010-05-23T21:32:36.407 回答
0

好的,接受 if())) 并不是真正的要求,只是我愿意接受的一个例子,以便使我的解析尽可能便宜,只是担心捕获控制结构。

然而,看来我不能这么便宜而且仍然可以工作。所以,由于 if() 构造有括号,我所要做的就是期望里面的内容有很好的平衡括号。没有预期的结束“)”不能成为条件的一部分。

我这样做了:

  val regularNoParens = ident | numericLit | decimalLit | stringLit | stmtSymbol 
  def regularParens: Parser[String] = "(" ~ rep(regularNoParens | regularParens) ~ ")" ^^ { case l ~ s ~ r => l + s.mkString(" ") + r } 
  def regularStr = rep(regularNoParens | regularParens) ^^ { case s => s.mkString(" ") }

我从stmtSymbol中取出“(”和“)”。作品!

编辑:它不支持嵌套,修复它。

于 2010-05-25T20:15:47.197 回答