You are recreating the partial function for every call here.
Better: introduce a val:

    private val fromTree: FromTree =
      (LiteralString
        orElse LiteralChar
        orElse Sequence
        orElse FirstOf)

and then

    def apply(tree: Tree): OpTree =
      fromTree.applyOrElse(tree, (t: Tree) ⇒ c.abort(c.enclosingPosition, "Invalid rule definition: " + t))