Aller au contenu

Référence Complète du Langage Galois

Table des Matières

  1. Introduction
  2. Types de Données
  3. Mots-clés et Tokens
  4. Opérateurs
  5. Expressions
  6. Instructions
  7. Fonctions
  8. Programmation Orientée Objet
  9. Collections
  10. Pattern Matching
  11. FFI - Interface avec C
  12. Modules
  13. Bibliothèque Standard
  14. Pipeline de Compilation
  15. Diagnostics et Erreurs

Introduction

Galois est un langage de programmation compilé, entièrement écrit en français, qui compile vers du code natif via LLVM.

Caractéristiques Principales

Caractéristique Description
Langue française Tous les mots-clés, types, messages d'erreur en français
Typage statique Avec inférence de types pour alléger l'écriture
Compilation native Via LLVM IR, pour des performances optimales
POO optionnelle Classes, héritage, interfaces, méthodes virtuelles
FFI Appels de fonctions C natives
Ramasse-miettes Collecte automatique de la mémoire
Diagnostics avancés Messages d'erreur contextuels avec snippets

Types de Données

Types Primitifs

Type Mot-clé Description Exemple
Entier entier Nombre entier 64 bits 42, -10
Décimal décimal Nombre à virgule flottante 64 bits 3.14, -0.5
Texte texte Chaîne de caractères "Bonjour"
Booléen booléen Valeur vrai ou faux vrai, faux
Nul nul Valeur nulle nul
Rien rien Type de retour vide -

Types Collections

Type Syntaxe Description
Tableau tableau<T> Tableau à taille fixe ou dynamique
Liste liste<T> Liste dynamique
Pile pile<T> Structure LIFO (dernier entré, premier sorti)
File file<T> Structure FIFO (premier entré, premier sorti)
Liste chaînée liste_chaînée<T> Liste chaînée
Dictionnaire dictionnaire<K, V> Association clé-valeur
Ensemble ensemble<T> Collection d'éléments uniques
Tuple tuple ou (T1, T2, ...) Collection hétérogène

Types FFI (Interface C)

Type Mot-clé Équivalent C
Pointeur pointeur<T> T*
Pointeur vide pointeur_vide void*
Entier C c_int int
Long C c_long long
Double C c_double double
Char C c_char char

Types Spéciaux

Type Description
Inconnu Type à inférer automatiquement
Fonction Type fonction avec paramètres et retour
Classe Type classe avec héritage optionnel
Interface Type interface

Mots-clés et Tokens

Contrôle de Flux

Mot-clé Description
si Conditionnelle
alors Début du bloc condition
sinon Bloc alternatif
sinonsi Condition alternative
fin Fin de bloc
tantque Boucle while
pour Boucle for
dans Itération dans une collection
faire Début de bloc de boucle
interrompre Sortie de boucle (break)
continuer Passage à l'itération suivante
sélectionner Switch/match
cas Cas du switch
pardéfaut Cas par défaut

Fonctions

Mot-clé Description
fonction Déclaration de fonction
retourne Retour de fonction
récursif Fonction récursive
asynchrone Fonction asynchrone (non implémenté)
attends Attente asynchrone (non implémenté)

Déclarations

Mot-clé Description
soit Déclaration de variable
constante Déclaration de constante
mutable Variable modifiable

POO

Mot-clé Description
classe Déclaration de classe
hérite Héritage
interface Déclaration d'interface
implémente Implémentation d'interface
constructeur Constructeur de classe
ceci Référence à l'instance courante
base Référence à la classe parente
abstraite Classe ou méthode abstraite
virtuelle Méthode virtuelle
surcharge Surcharge de méthode
nouveau Instanciation
publique Visibilité publique
privé Visibilité privée
protégé Visibilité protégée

Modules

Mot-clé Description
module Déclaration de module
importe Import de module
exporte Export de symboles
depuis Source de l'import

FFI

Mot-clé Description
externe Déclaration de fonction externe

Opérateurs

Opérateurs Arithmétiques

Opérateur Description Exemple
+ Addition a + b
- Soustraction a - b
* Multiplication a * b
/ Division a / b
% Modulo a % b
** Puissance a ** 2
// Division entière a // b

Opérateurs de Comparaison

Opérateur Description Exemple
== Égalité a == b
!= Différence a != b
< Inférieur a < b
> Supérieur a > b
<= Inférieur ou égal a <= b
>= Supérieur ou égal a >= b

Opérateurs Logiques

Opérateur Description Exemple
et ou && ET logique a et b
ou ou || OU logique a ou b
non ou ! NON logique non a

Opérateurs Bit à Bit

Opérateur Description Exemple
& ET bit à bit a & b
\| OU bit à bit a \| b

Opérateurs d'Affectation

Opérateur Description Exemple
= Affectation x = 10
+= Addition et affectation x += 5
-= Soustraction et affectation x -= 5
*= Multiplication et affectation x *= 2
/= Division et affectation x /= 2
%= Modulo et affectation x %= 3

Opérateurs Spéciaux

Opérateur Description Exemple
|> Pipe (chaînage) x \|> f \|> g
.. Intervalle 1..10
: Annotation de type x: entier
-> Type de retour fonction f(): -> entier
=> Corps de lambda x => x * 2

Expressions

Littéraux

42                  // Entier
3.14                // Décimal
"Bonjour"           // Texte
vrai                // Booléen
faux                // Booléen
nul                 // Nul

Opérations Binaires

a + b
a * b + c
(a + b) * c
x ** 2 + y ** 2

Opérations Unaires

-x                  // Négation
non est_valide      // Négation logique

Appels de Fonction

afficher("Bonjour")
factorielle(10)
ma_fonction(a, b, c)

Accès aux Membres

personne.nom
personne.adresse.ville

Accès par Indice

liste[0]
dictionnaire["clé"]
matrice[i][j]

Expressions Conditionnelles

si condition alors valeur1 sinon valeur2 fin

Lambdas

fonction(x) retourne x * 2 fin
(x, y) => x + y

Pipe

données |> filtrer |> transformer |> afficher

Initialisation de Collections

// Tableau
[1, 2, 3, 4, 5]

// Dictionnaire
{"nom": "Alice", "âge": 30}

// Tuple
(1, "texte", vrai)

Instanciation de Classe

nouveau Personne("Alice", 30)
nouveau Point { x: 0, y: 0 }

Transtypage

x comme décimal
entier(3.14)

Instructions

Déclaration de Variable

soit x = 42
soit nom: texte = "Alice"
mutable compteur = 0
constante PI = 3.14159

Affectation

x = 10
compteur += 1
personne.nom = "Bob"

Conditionnelle

si x > 0 alors
    afficher("positif")
sinonsi x < 0 alors
    afficher("négatif")
sinon
    afficher("zéro")
fin

Boucle TantQue

tantque x < 10 faire
    afficher(x)
    x = x + 1
fin

Boucle Pour (itération)

pour élément dans collection faire
    afficher(élément)
fin

Boucle Pour (compteur)

pour i de 1 à 10 faire
    afficher(i)
fin

pour i de 0 à 100 pas 10 faire
    afficher(i)
fin

Sélectionner (Switch)

sélectionner valeur
    cas 1 => afficher("un")
    cas 2 => afficher("deux")
    pardéfaut => afficher("autre")
fin

Contrôle de Boucle

tantque vrai faire
    si condition alors
        interrompre      // Sort de la boucle
    fin
    continuer            // Passe à l'itération suivante
fin

Retour de Fonction

retourne valeur
retourne              // Retour vide

Fonctions

Déclaration Simple

fonction saluer(nom: texte)
    afficher("Bonjour " + nom)
fin

Avec Type de Retour

fonction carré(x: décimal): décimal
    retourne x * x
fin

Fonction Récursive

récursif fonction factorielle(n: entier): entier
    si n < 2 alors
        retourne 1
    sinon
        retourne n * factorielle(n - 1)
    fin
fin

Paramètres par Défaut

fonction saluer(nom: texte, salutation: texte = "Bonjour")
    afficher(salutation + " " + nom)
fin

Fermetures (Closures)

soit compteur = fonction()
    mutable n = 0
    retourne fonction()
        n = n + 1
        retourne n
    fin
fin

Programmation Orientée Objet

Déclaration de Classe

classe Personne
    publique nom: texte
    privé âge: entier

    constructeur(nom: texte, âge: entier)
        ceci.nom = nom
        ceci.âge = âge
    fin

    publique fonction présenter()
        afficher("Je m'appelle " + ceci.nom)
    fin
fin

Héritage

classe Étudiant hérite Personne
    publique filière: texte

    constructeur(nom: texte, âge: entier, filière: texte)
        base(nom, âge)           // Appel du constructeur parent
        ceci.filière = filière
    fin

    surcharge fonction présenter()
        afficher("Je suis étudiant en " + ceci.filière)
    fin
fin

Interface

interface Affichable
    fonction vers_texte(): texte
fin

classe Produit implémente Affichable
    publique nom: texte
    publique prix: décimal

    fonction vers_texte(): texte
        retourne ceci.nom + " - " + texte(ceci.prix) + "€"
    fin
fin

Classes Abstraites

abstraite classe Forme
    abstraite fonction aire(): décimal

    fonction décrire()
        afficher("Aire: " + texte(ceci.aire()))
    fin
fin

classe Cercle hérite Forme
    publique rayon: décimal

    fonction aire(): décimal
        retourne 3.14159 * ceci.rayon ** 2
    fin
fin

Méthodes Virtuelles

classe Animal
    virtuelle fonction parler()
        afficher("...")
    fin
fin

classe Chien hérite Animal
    surcharge fonction parler()
        afficher("Wouf!")
    fin
fin

Visibilité

Modificateur Accès
publique Partout
privé Uniquement dans la classe
protégé Classe et sous-classes

Collections

Liste

soit lst: liste<entier> = [1, 2, 3, 4, 5]

lst.ajouter(6)           // Ajoute à la fin
lst.supprimer(0)         // Supprime à l'indice
lst[0]                   // Accès par indice
lst.taille()             // Taille

Dictionnaire

soit dict: dictionnaire<texte, entier> = {"a": 1, "b": 2}

dict["c"] = 3            // Ajout/modification
dict["a"]                // Accès
dict.contient("a")       // Vérification
dict.clés()              // Liste des clés
dict.valeurs()           // Liste des valeurs

Ensemble

soit ens: ensemble<entier> = {1, 2, 3}

ens.ajouter(4)           // Ajout
ens.contient(2)          // Vérification
ens.union(autre)         // Union
ens.intersection(autre)  // Intersection

Pile (LIFO)

soit p: pile<entier>

p.empiler(1)
p.empiler(2)
p.dépiler()              // Retourne 2
p.sommet()               // Voir le sommet

File (FIFO)

soit f: file<entier>

f.enfiler(1)
f.enfiler(2)
f.défiler()              // Retourne 1
f.tête()                 // Voir la tête

Tuple

soit t: (entier, texte, booléen) = (42, "test", vrai)

t.0                      // Premier élément: 42
t.1                      // Deuxième élément: "test"

Pattern Matching

Patterns Simples

sélectionner valeur
    cas 0 => afficher("zéro")
    cas 1 => afficher("un")
    cas n => afficher("nombre: " + texte(n))
fin

Décomposition de Tuple

sélectionner point
    cas (0, 0) => afficher("origine")
    cas (x, 0) => afficher("sur l'axe x")
    cas (0, y) => afficher("sur l'axe y")
    cas (x, y) => afficher("point quelconque")
fin

Décomposition de Liste

sélectionner liste
    cas [] => afficher("vide")
    cas [x] => afficher("un élément: " + texte(x))
    cas [premier, ...reste] => afficher("premier: " + texte(premier))
fin

Intervalle

sélectionner note
    cas 0..59 => afficher("Échec")
    cas 60..69 => afficher("Passable")
    cas 70..79 => afficher("Bien")
    cas 80..100 => afficher("Très bien")
fin

Alternative

sélectionner valeur
    cas 1 ou 2 ou 3 => afficher("petit")
    cas 4 ou 5 ou 6 => afficher("moyen")
fin

FFI - Interface avec C

Déclaration de Fonction Externe

externe fonction printf(format: texte): entier
externe fonction malloc(taille: entier): pointeur_vide
externe fonction free(ptr: pointeur_vide): rien

Types C

Type Galois Type C
c_int int
c_long long
c_double double
c_char char
pointeur<T> T*
pointeur_vide void*

Exemple Complet

externe fonction strlen(s: pointeur<c_char>): c_long

fonction longueur_chaîne(s: texte): entier
    retourne strlen(s comme pointeur<c_char>)
fin

Modules

Déclaration de Module

module MaBibliothèque
    exporte fonction utilitaire()
        // ...
    fin

    fonction interne()    // Non exportée
        // ...
    fin
fin

Import

importe MaBibliothèque
importe { fonction1, fonction2 } depuis AutreModule

Bibliothèque Standard

Module maths

Constantes

maths.pi          // 3.14159...
maths.e           // 2.71828...
maths.phi         // 1.61803...
maths.infini      // Infinité

Fonctions Trigonométriques

maths.sin(x)      maths.cos(x)      maths.tan(x)
maths.arcsin(x)   maths.arccos(x)   maths.arctan(x)
maths.arctan2(y, x)

Fonctions Hyperboliques

maths.sinh(x)     maths.cosh(x)     maths.tanh(x)

Fonctions Exponentielles et Logarithmiques

maths.exp(x)      maths.log(x)      maths.log2(x)
maths.log10(x)    maths.log_base(x, base)

Fonctions de Puissance

maths.puissance(base, exp)
maths.racine(x)
maths.racine_cubique(x)
maths.racine_nième(x, n)

Fonctions d'Arrondi

maths.absolu(x)       maths.absolu_entier(x)
maths.plafond(x)      maths.plancher(x)
maths.arrondi(x)      maths.tronquer(x)
maths.signe(x)

Fonctions de Minimum/Maximum

maths.min(a, b)       maths.max(a, b)
maths.min_entier(a, b)   maths.max_entier(a, b)

Fonctions Aléatoires

maths.aleatoire()              // Décimal entre 0 et 1
maths.aleatoire_entier(min, max)
maths.aleatoire_graine(graine)

Fonctions Utilitaires

maths.pgcd(a, b)      maths.ppcm(a, b)
maths.factorielle(n)  maths.fibonacci(n)
maths.est_premier(n)

Fonctions Statistiques

maths.moyenne(données)
maths.médiane(données)
maths.écart_type(données)
maths.variance(données)

Classe Complexe

soit c = nouveau maths.Complexe(3.0, 4.0)
c.module()        // 5.0
c.argument()      // atan2(4, 3)
c.conjugué()
c.ajouter(autre)
c.multiplier(autre)

Classe Fraction

soit f = nouveau maths.Fraction(3, 4)
f.valeur_décimale()   // 0.75
f.ajouter(autre)
f.multiplier(autre)

Classe Matrice

soit m = nouveau maths.Matrice(3, 3)
m.obtenir(i, j)
m.définir(i, j, valeur)
m.additionner(autre)
m.multiplier(autre)
m.transposée()
m.trace()
m.déterminant()

Module texte

soit t = nouveau texte.TexteÉtendu("Bonjour")

t.longueur()
t.majuscule()
t.minuscule()
t.inverse()
t.est_palindrome()
t.compte("o")
t.remplace_tous("o", "a")

Module entrée_sortie

entrée_sortie.afficher_ligne("Texte")
soit ligne = entrée_sortie.lire_ligne()
soit n = entrée_sortie.lire_entier()
soit x = entrée_sortie.lire_décimal()
soit s = entrée_sortie.formater("Nom: {}, Âge: {}", ["Alice", "30"])

Module collections

collections.intervalle(0, 10)           // [0, 1, 2, ..., 10]
collections.zip(liste1, liste2)          // [(a1, b1), (a2, b2), ...]
collections.chaîner([liste1, liste2])    // Concaténation
collections.unique(liste)                // Sans doublons
collections.regrouper_par(liste, clé)    // Groupe par clé
collections.trier_par(liste, clé)        // Tri personnalisé
collections.partition(liste, prédicat)   // (vrais, faux)

Pipeline de Compilation

Étapes

Source (.gal)
┌─────────────────┐
│     Lexer       │ → Tokens
└─────────────────┘
┌─────────────────┐
│     Parser      │ → AST (ProgrammeAST)
└─────────────────┘
┌─────────────────┐
│   Vérificateur  │ → Diagnostics + TableSymboles
└─────────────────┘
┌─────────────────┐
│   GénérateurIR  │ → IRModule
└─────────────────┘
┌─────────────────┐
│  GénérateurLLVM │ → LLVM IR
└─────────────────┘
┌─────────────────┐
│  CompilateurNat │ → Exécutable natif
└─────────────────┘

Module Pipeline

use galois::pipeline::Pipeline;

let pipeline = Pipeline::depuis_fichier("programme.gal")?;

// Étapes individuelles
let résultat = pipeline.lexer()?;
let résultat = pipeline.parser()?;
let résultat = pipeline.vérifier()?;
let résultat = pipeline.ir()?;
let résultat = pipeline.llvm()?;

// Afficher les diagnostics
résultat.afficher_diagnostics();

Diagnostics et Erreurs

Codes d'Erreur

Code Type Description
E001 Lexicale Erreur lors de l'analyse lexicale
E002 Syntaxique Erreur de syntaxe
E003 Sémantique Erreur sémantique
E004 Type Erreur de typage
E005 Runtime Erreur d'exécution

Codes d'Avertissement

Code Type Description
W001 VariableNonUtilisée Variable non utilisée
W002 ParamètreNonUtilisé Paramètre non utilisé
W003 CodeMort Code inaccessible
W004 ConversionImplicite Conversion implicite
W005 Shadowing Variable masquante
W006 ImportInutilisé Import non utilisé

Format des Messages

Erreur de type[E004]: type incompatible
  --> fichier.gal:5:9
   |
5  | soit x: entier = "texte"
   |         ^^^^^^ attendu entier, trouvé texte
   |
   = suggestion: utilisez une valeur entière

Multi-Erreurs

Le compilateur collecte plusieurs erreurs avant de s'arrêter, permettant de voir plusieurs problèmes en une seule passe.


CLI - Interface en Ligne de Commande

Commandes

Commande Raccourci Description
build b Compiler vers exécutable
run r Compiler et exécuter
compiler c Compiler vers LLVM IR
init - Créer un nouveau projet
add - Ajouter une dépendance
lexer lex Afficher les tokens
parser p Afficher l'AST
vérifier v Vérifier les types
ir - Afficher l'IR
doc - Générer la documentation
debug - Compiler avec debug

Options

Option Description
-o, --output <fichier> Fichier de sortie
-r, --release Optimisations (-O3, strip)
--keep Garder les fichiers intermédiaires

Exemples

# Compilation simple
galois build programme.gal

# Compilation optimisée
galois build programme.gal --release -o mon_app

# Exécution directe
galois run programme.gal

# Création de projet
galois init mon_projet
cd mon_projet
galois build

# Débogage
galois lexer programme.gal
galois parser programme.gal
galois vérifier programme.gal
galois ir programme.gal

Annexes

Mots-clés Réservés

Les mots-clés suivants sont réservés et ne peuvent pas être utilisés comme identifiants:

si, alors, sinon, sinonsi, fin, tantque, pour, dans, faire,
interrompre, continuer, sélectionner, cas, pardéfaut,
fonction, retourne, récursif, asynchrone, attends,
entier, décimal, texte, booléen, nul, rien,
tableau, liste, pile, file, liste_chaînée, dictionnaire, ensemble, tuple,
classe, hérite, interface, implémente, constructeur, ceci, base,
abstraite, virtuelle, surcharge, nouveau,
publique, privé, protégé,
module, importe, exporte, depuis,
externe, pointeur, pointeur_vide, c_int, c_long, c_double, c_char,
soit, constante, mutable, comme, est, vrai, faux, où, et, ou, non

Précédence des Opérateurs

Du plus élevé au plus bas:

  1. () [] . (parenthèses, indices, membres)
  2. ! non - (unaires)
  3. ** (puissance)
  4. * / % // (multiplication, division, modulo)
  5. + - (addition, soustraction)
  6. < > <= >= (comparaison)
  7. == != (égalité)
  8. et && (ET logique)
  9. ou || (OU logique)
  10. |> (pipe)
  11. = += -= *= /= %= (affectation)