在 scala 解析器组合器中替代 rep1sep

Alternative to rep1sep in scala parser combinator

我想写这样的东西:andExpr 是由 "and" 分隔的 orExpr。如果它没有被 "and" 分隔,则应将其视为文字而不是 orExpr 。

所以,如果我这样做:

def andExpr: Parser[Expr] = rep1sep(orExpr, "and") ^^{ 
  //omitting the transformation function 
} | literal

让我们假设每个表达式都是一个 andExpr。 我希望表达式仅在被 "and" 分隔时才为 orExpr。例如,如果输入是 "hello and hi",在这种情况下 "hello" 是一个 orExpr,"hi" 是一个 orExpr。 但是现在(我编写的现有代码)默认情况下每个 andExpr 都是 orExpr。所以,现在如果输入是 "bye",它也是一个 orExpr。但是,我希望 "bye" 被限定为文字而不是 orExpr。

我该怎么做?

我们可以使用复杂的 case 语句来做到这一点。

例如:

def andExpr: Parser[Expr] = rep1sep(orExpr, "and") ^^{ 
  case terms: if(terms.length == 1) {
                   terms.head . //treating like literal
               } else {
                  //required expression
               }

}