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