在 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
}
}
我想写这样的东西: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
}
}