• [^] # Re: PAST => PIR => PASM => PBC

    Posté par . En réponse au journal Publication de Parrot 1.0. Évalué à 3.

    PAST n'est pas un langage lu par Parrot, il s'agit uniquement d'un ensemble de classes prédéfinies pour décrire l'arbre de syntaxe abstraite d'un programme.

    Il y a par exemple PAST::Block, qui représente... un bloc ! Par exemple : des espaces de noms, des fonctions (ces dernières sont des blocs non immédiats : le corps n'est pas évalué tout de suite), ou encore, par exemple en C, tout ce qui se trouve entre des accolades. Il existe aussi PAST::Op : cette classe contient un appel à un opérateur, avec ses arguments (pour représenter un if/then/else, on mettrait l'opérateur "if" avec un nœud PAST pour la condition, et deux blocs pour le then et le else).

    L'avantage de ces classes, c'est que le code est déjà prévu dans Parrot pour les transformer automatiquement en PIR. Cela facilite l'étape de génération de code quand on écrit un compilateur vers Parrot.

    Pour écrire un compilateur, plusieurs outils (mini-langages) ont été prévus (ce sont les Parrot Compiler Tools) :
    * on décrit la grammaire de son langage avec des regex Perl6,
    * un mini-perl (NQP, pour Not Quite Perl) permet de transformer le résultat de l'analyse de la grammaire en nœuds PAST,
    * et la plupart du temps, cela suffit à Parrot pour produire du PIR.

    Sinon, le compilateur PIR produit directement du PBC, et pas du PASM (même si ça a dû être le cas à une époque : actuellement, la transformation PIR -> PASM n'est pas faite correctement).