私はこれを試しました
import scala.util.parsing.combinator._
def name = ident ^^ {case ident => if (ident.contains("a")) ident.toUpperCase else ident
println(parseAll(name, "aa")) // parsed: AA
println(parseAll(name, "bb"))
出力あり
[1.3] parsed: AA
[1.3] parsed: bb
[1.1] failure: `(' expected but `a' found
aa
^
[1.3] failure: end of input expected
f1(aa)
^
ご覧のとおり、2 番目の解析は失敗します。最初の生産で失敗すると、2 番目の代替案を試すことができなくなるようです。実際には、最初の識別子の値に応じて、これまたはそのパーサーを選択して続行したいと考えています。