Étendre l'interpréteur lui-même

Ajouter une nouvelle fonction native (le changement le plus courant) : choisis le bon registerBuiltin*() dans src/Interpreter.cpp (ou defineNatives() pour quelque chose qui doit toujours être disponible, sans IMPORT://), et ajoute un appel def("nom", [...](std::vector<Value>& args) -> Value { ... }). Regarde une fonction voisine pour la convention de vérification d'arguments (lève std::runtime_error avec un message clair sur le mauvais type/nombre). Documente-la ensuite dans ce fichier, et — si c'est du calcul pur sans accès système de fichiers/réseau/processus — envisage de la porter aussi dans exemples/ton618-lite.js, pour que le playground du navigateur reste synchronisé (voir le commentaire d'en-tête de ce fichier pour ce qu'il peut et ne peut pas prendre en charge).

Ajouter un nouvel opérateur ou mot-clé : ajoute un TokenType (Token.hpp), apprends au Lexer à le produire (src/Lexer.cpp — la map keywords pour un mot, scanToken() pour de la ponctuation), puis apprends au Parser à le consommer au bon niveau de précédence (voir le commentaire de Parser.hpp sur la chaîne expression -> assignment -> ternary -> ...) et à l'Interpreter à l'évaluer.

Ajouter un nouveau type d'instruction (comme switch l'a été) : ajoute un StmtType dans Ast.hpp (en réutilisant les champs existants là où ça convient, plutôt que de faire grossir la struct), une méthode de parsing dans Parser.cpp appelée depuis statement(), et un case dans Interpreter::execute().

Ajouter un nouveau type de valeur (par ex. un ton.set) :

  1. Ajoute un ValueType et un champ de stockage dans include/Value.hpp ; étends typeName(), toString(), toJson().
  2. Ajoute un VarKind dans include/Ast.hpp et un TokenType/mot-clé (Token.hpp, Lexer.cpp) s'il a besoin de sa propre syntaxe de déclaration ton.<type>.
  3. Étends Interpreter::checkType (src/Interpreter.cpp) pour que ton.<type> x = ... l'impose.
  4. Ajoute la syntaxe littérale dans Parser::primary() si le type en a besoin (regarde comment les littéraux ARRAY/DICT y sont parsés), et le support d'évaluation dans Interpreter::evaluate.

Après tout changement, lance make et vérifie avec les scripts de exemples/ (en particulier exemples/test_new_features.ton) avant de te fier au changement.

Modifier cette page sur GitHub