EN

pcosmos.ca

l'univers de Philippe Choquette

Accueil
Nouvelles
Profil
Contact
Half-Life
Musique
PCASTL
Informatique
Vidéos
Lecture
OpenGL
Éléments
sids du C64
Liens
Opérateurs
Types de données
Fonctions internes
Structure de l'arbre
Traitement par lots
Exemples
Interpréteur

PCASTL
by Parent and Childset Accessible Syntax Tree Language

Le PCASTL est un langage de programmation de haut niveau qui rend l'écriture de code automodifiant plus facile. Ses caractéristiques sont :

  • Le mot clé "parent" pour accéder à un noeud parent dans l'arbre syntaxique du code.
  • Le mot clé "childset" pour accéder à un noeud enfant dans l'arbre syntaxique du code.
  • L'usage de segments de code explicites délémités par ` et '.
  • Permet les appels à des "dynamic-link libraries", des "shared object libraries" ou des "dynamic libraries".
  • Types de données objet, tableau et liste chaînée. Ils sont respectivement créés par les fonctions internes names, array et list.
  • Interface pour les fonctions de ANSI stdio.h pour les chaînes de caractères à un seul octet.
  • Turing-complet.

La version la plus récente est 3.5 et date du 2018-03-31.
Liste des changements.

Alors, qu'est-ce qu'un arbre syntaxique?

Par exemple, à l'intérieur de l'interpréteur, l'arbre ayant sa racine dans la variable fact après que ce code ait été exécuté :

fact = function(x)
{
   if (x == 1) return(1)
   return(x * fact(x - 1))
}

est :

Arbre syntaxique

Ci-dessous vous pouvez voir comment les mots réservés childset et parent peuvent être utilisés pour explorer cet arbre.

> info(fact)
[node_type]     "function definition"
[nb_children]   2
[parameters][0] "x"
>
> info(fact.childset[0])
[node_type]     "list"
[nb_children]   1
>
> info(fact.childset[0].childset[0])
[node_type]     "variable"
[nb_children]   0
[name]  "x"
>
> info(fact.childset[1])
[node_type]     "list"
[nb_children]   2
>
> info(fact.childset[1].childset[0])
[node_type]     "if statement"
[nb_children]   2
>
> info(fact.childset[1].childset[1])
[node_type]     "function call"
[nb_children]   2
[nb_args]       1
>
> info(fact.childset[0].parent)
[node_type]     "function definition"
[nb_children]   2
[parameters][0] "x"

Voici des façons de modifier l'arbre:

> mknode(fact.childset[1], `if (x < 1) {
+    print("Parameter must be greater than zero.")
+    abort()
+ }', 0)
> fact(-2)
        "Parameter must be greater than zero."
> info(fact.childset[1])
[node_type]     "list"
[nb_children]   3
>
> info(fact.childset[1].childset[0].childset[1].childset[1])
[node_type]     "function call"
[nb_children]   2
[nb_args]       0
>
> fact.childset[1].childset[0].childset[1].childset[1] = `return(-1)'
        0x431c20
> info(fact.childset[1].childset[0].childset[1].childset[1])
[node_type]     "function call"
[nb_children]   2
[nb_args]       1
>
> fact(-2)
        "Parameter must be greater than zero."
        -1
Mobile
linkedin
bandcamp
steam