So, if we agree that "I am your father, John" and "sleep, John" are vocative constructions, even in languages where there is no explicit vocative case marking on the noun:
then it's not a huge stretch to see "sleep, please" as a vocative construction too: we are clearly addressing someone, even though there's no noun. So we call please_Voc and VocNP (UsePN john_PN) vocatives, because they turn any sentence ("I don't know", "it's raining", …) into a vocative sentence: "I don't know, John" , "it's raining, John".
Cheers,
Inari
P.S. for those who dislike simplifications:
* The adressee could as well come before the rest of the sentence, so "Luke, I am your father" is equally fine vocative construction as "I am your father, Luke", it just happens that in the common core of RGL, there's only one function which takes Voc (PhrUtt : PConj -> Utt -> Voc -> Phr) and it places the Voc in the last place of the sentence. We could make another function in Extend, if it becomes necessary: e.g. PhrUttPreVoc with the same type signature, which would create sentences such as "Luke, do your homework".
* With imperatives it's a bit redundant to say that "please" or "John" makes it into vocative, you can say that an imperative is by default addressed to someone. The alternative would be to make a different constructor for please that applies only to imperatives, e.g. UttImpPlease alongside UttImpSg/Pl/Pol. (However, talking about changing the RGL abstract syntax is a purely theoretical pastime, we're not going to throw away all the work been done in the existing RGs.)
So how about if in some language please is treated in a completely different way, e.g. placed inside a VP--should such a language keep its Utt as a complex inflection table? In my opinion, if that makes the difference between a decently fast and a prohibitively slow RG, we should just accept (and document!) that
PhrUtt … please_Voc is ungrammatical for that language, and advise application grammarians to make
please into another part of speech in their applications, for instance an adverb. Then this language would choose the tree
PhrUtt NoPConj (UttImpSg PPos (ImpVP (AdvVP (UseV sleep_V) please_Adv))) NoVoc where other languages would choose
PhrUtt NoPConj (UttImpSg PPos (ImpVP (UseV sleep_V))) please_Voc. (Of course, not using these trees directly, but the API constructors that under the hood create these trees.)
* Another potential nitpick is that if we mean by vocative "any construction that addresses someone", then "I am your father" is also a vocative construction, because there is clearly some "you" that the speaker is addressing, and adding ", Luke" doesn't change anything. Sure, that is true, but not the point of the RGL to make such fine-grained distinctions in the abstract syntax. If it makes a grammatical difference in some language whether youSg_Pron or youPl_Pron is the object, you can add an isYouPron : Bool field into the lincat of NP and handle it in ComplSlash.