EN

pcosmos.ca

l'univers de Philippe Choquette

PCASTL

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.4 et date du 2016-04-09.
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