我正在使用 Scala 中的解析器组合器解析一种语言,我想表达 CFG 规则
stmt -> if (stmt) {stmt}
自然,我希望在构造结果时丢弃“if(){}”字符串文字。我考虑过的两种方式都很丑陋。
方法 (A) 要求我们在“case”语句中复制字符串文字的位置:
lazy val stmt: PackratParser[Stmt] =
(
// other rules...
| "if"~"("~stmt~")"~"{"~stmt~"}" ^^ { case _~_~s1~_~_~s2~_ ⇒ If(s1, s2) }
)
由于 ~ 和 ~> 的优先级,方法 (B) 需要混淆括号。
lazy val stmt: PackratParser[Stmt] =
(
// other rules...
| ("if"~>"("~>stmt)~(")"~>"{"~>stmt<~"}") ^^ { case s1~s2 ⇒ If(s1, s2) }
)
理想情况下,我想丢弃 "(",")" 文字,而不需要在我的 Scala 代码中使用括号。有没有一种干净的方法可以做到这一点?