0

J'ai rapidement écrit un interpréteur pour une sorte de langage de programmation expérimental que j'ai trouvé, en PHP (oui, en PHP). La langue elle-même n'a rien de vraiment spécial, je voulais juste essayer.Hiérarchie d'instructions dans les langages de programmation

J'ai les choses de base qui fonctionnent (Hello World, entrée en sortie, manipulation de chaînes, arithmétique) mais je suis coincé avec la gestion des blocs et des instructions groupées. Ce que je veux dire est: PHP et la plupart des autres langues vous permettent de faire ceci: ((2+2)*(8+2)+2), bien sûr, non seulement avec des calculs mathématiques.

Ma structure de programme se compose actuellement d'un tableau multidimensionnel construit comme ceci:

ID => Type (Identifier, String, Int, Newline, EOF, Comma, ...) 
     Contents (If identifier, int or string) 
  • Comment pourrais-je permettre des déclarations à exécuter dans un ordre défini comme dans l'exemple ci-dessus PHP?

Répondre

4

Je vous suggère de lire un article ou un livre d'introduction sur les compilateurs/interprètes d'écriture. Il y a un certain nombre d'excellents livres et articles sur le sujet en ligne et à la bibliothèque. Je donnerais des liens, mais je ne connais pas votre parcours.

En général, la première étape de la création d'un interpréteur consiste à utiliser une structure arborescente (pas une matrice). Exemple:

 + 
    /\ 
     * 2 
    / \ 
    +  + 
/\ /\ 
2 2 8 2 

Cette partie est plus ou moins la même peu importe la langue que vous utilisez et quelle langue que vous essayez d'analyser. De là, vous pouvez directement évaluer l'arbre ou vous pouvez le transformer en une structure différente.

+0

S'il veut simplement évaluer des expressions, il n'est pas nécessaire de construire explicitement un arbre. Pareil s'il utilise une approche de descente récursive pour une langue plus complète - aucun arbre explicite n'est nécessaire. –

+0

@Neil: oui, le livre Dragon l'appelle "traduction dirigée par la syntaxe" –

0

Premièrement, vous devez donner à votre langage une idée de la priorité des opérateurs. Ensuite, vous donnez à l'opérateur (une priorité très faible, et l'opérateur) un très haut. Mais ce sujet est vraiment trop compliqué pour une réponse SO - vous devez lire sur les façons d'évaluer les expressions. Jetez un oeil à des ressources d'interprétation compilateur SO & à Learning to write a compiler

Questions connexes