Voici deux grammaires. On utilise un Quelles sont les situations justifient tout le tapé supplémentaire? Les jetons existe une partie de jeton de proto code> et on ne le fait pas. Ils ont tous deux la même chose. Ce sont fondamentalement les exemples de S05 sous "variable (non) interpolation" . Dans cet exemple simple, ils sont tous deux capables de faire les mêmes choses.
proto code> ont des méthodes distinctes dans la classe d'action et peut-être un petit avantage là-bas. Cependant, vous devez taper des choses supplémentaires pour obtenir cet avantage. P>
proto code> qui rend d'autres parties de la grammaire plus facile? P>
------No proto parsing
found sigil: $
found identifier: butterfuly
found variable: $butterfuly
------Yes proto parsing
found sym sigil: $
found identifier: butterfuly
found variable: $butterfuly
3 Réponses :
Techniquement, un Pourquoi spécifieriez-vous un oui, le montre: p> espère que cela aide: -) p> p> proto code> sera préparé pour vous si vous ne le spécifiez pas vous-même. Il crée fondamentalement le gestionnaire de distribution multi-méthodes pour ce
jeton code> (tel qu'il le fait avec
sous code> et
méthode code>). Que vous n'avez généralement pas besoin de vous soucier.
proto code>? Je peux penser à un certain nombre de raisons: p>
code> s pour partager des traits li>
{*} code> peut contenir du code exécutable. Le
quel que soit code> indique l'envoi du candidat approprié. Montrant cela dans une situation plus simple avec
sous code>: p>
Ah ok. Mais pourquoi la méthode sigil code> dans la classe d'action est-elle appelée? Je peux voir une utilisation pour cela en dehors des grammaires, mais j'essaie de penser à une affaire à l'intérieur de grammaires. Les exemples que j'ai vus n'ont pas été complexes, ou ils ont été cultes de cargaison.
Avoir la méthode appelle dans une classe d'actions peut être utile pour séparer la logique. Il est fondamentalement le même genre d'idée que Multiméthodes sauf pour les grammaires.
(I a écrit ce Pour évaluer les réponses à un Golf ) P>
grammar Mathmania-Plus is Mathemania { token op:sym<negate> { n } token op:sym<abs> { a } } class Calculate-Plus is Calculate { method op:sym<negate> ($/) { make &prefix:<-> } method op:sym<abs> ($/) { make &abs } }
Donc, pour un sous-grammaire (grammaire | classe), vous n'avez pas à remplacer ou à prolonger des méthodes. C'est bien des choses.
Un avantage de fractionnement de vos alternatives dans un proto et une multis est que vous pouvez l'étendre plus de manière fiable. Vous pouvez ajouter des multis au proto existant dans une grammaire qui hérite de la grammaire qui déclare le proto, et vous n'avez pas besoin d'énumérer toutes les alternatives possibles (que vous auriez à faire dans le cas d'une seule règle). p>
Cela signifie que vous pouvez même avoir plusieurs extensions indépendantes à la même grammaire, par exemple en mélangeant plusieurs règles qui fournissent des multis à différents symboles pour correspondre. P>
Il s'agit fondamentalement du mécanisme que Perl 6 utilise lui-même lorsque vous définissez un opérateur personnalisé: il existe des règles pour correspondre aux différents types d'opérateurs (comme l'infixe, le préfixe, le postfix, ...) et la déclaration d'un nouvel opérateur dérive Nouvelle grammaire de l'actuellement actif, avec un candidat multiple ajouté pour le nouvel opérateur. Un script peut importer des opérateurs de plusieurs modules qui ne se connaissent pas les uns des autres grâce à l'extensibilité du mécanisme de jeton de proto. P>