gpt4 book ai didi

scala - 使用 ~> <~ 丢弃 Scala 解析器组合器中的几个文字

转载 作者:行者123 更新时间:2023-12-04 02:54:02 24 4
gpt4 key购买 nike

我正在用 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 代码中丢弃不需要括号的文字“(”,")”。有没有一种干净的方法可以做到这一点?

最佳答案

在没有大量括号的情况下避免优先级问题的通常方法是定义一些助手,在我看来,它在这里工作得很好:

val cond       = "(" ~> stmt <~ ")"
val thenClause = "{" ~> stmt <~ "}"
val ifStmt = "if" ~> cond ~ thenClause ^^ { case s1 ~ s2 => If(s1, s2) }

如果出于某种原因这不是一个选项,我肯定会避免您的第一种方法,并且我会调整第二种方法以使优先级管理括号与语法更清晰地匹配——即,像这样:

"if" ~> ("(" ~> stmt <~ ")") ~ ("{" ~> stmt <~ "}") ^^ {
case s1 ~ s2 => If(s1, s2)
}

这不是很好,但也不是绝对不可读。

关于scala - 使用 ~> <~ 丢弃 Scala 解析器组合器中的几个文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com