Skip to content

oughzal/Algo-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Compilateur de Pseudo-code Français (AlgoC)

Un compilateur/interpréteur de pseudo-code français écrit en Kotlin, conçu pour faciliter l'apprentissage de la programmation avec une syntaxe française naturelle.

Caractéristiques

  • Syntaxe française naturelle : Utilise des mots-clĂ©s français intuitifs
  • Variables et constantes typĂ©es : Support des types entier, rĂ©el, chaĂ®ne, caractère et boolĂ©en
  • Tableaux : Support complet des tableaux avec indexation
  • Fonctions et procĂ©dures : DĂ©finition et appel de fonctions avec paramètres et valeurs de retour
  • Fonctions intĂ©grĂ©es : Bibliothèque riche de fonctions mathĂ©matiques, de chaĂ®nes et alĂ©atoires
  • Structures de contrĂ´le : Si/Alors/Sinon, Pour, TantQue, RĂ©pĂ©ter/Jusqu'Ă 
  • OpĂ©rations : ArithmĂ©tiques (y compris div et mod), logiques et de comparaison
  • EntrĂ©e/Sortie : Instructions Lire et Écrire avec support de plusieurs formats (voir dĂ©tails)
  • Commentaires : Support de commentaires simples (//, #) et multi-lignes (/* */)
  • FlexibilitĂ© syntaxique : Accents optionnels et insensibilitĂ© Ă  la casse

Installation

🚀 Installation Automatique (Recommandée)

Prérequis : Java 21 ou supérieur

Méthode 1 : Installateur Batch (Simple)

  1. Compiler le projet : gradlew build
  2. Clic droit sur install-algo-compiler.bat
  3. Sélectionner "Exécuter en tant qu'administrateur"
  4. Suivre les instructions

Méthode 2 : Installateur PowerShell (Avancé)

  1. Compiler le projet : .\gradlew build
  2. Ouvrir PowerShell en administrateur
  3. Exécuter : .\install-algo-compiler.ps1
  4. Suivre les instructions

Après installation, utilisez simplement :

algoc fichier.algo

đź“– Guide complet : Voir GUIDE_INSTALLATION.md


đź”§ Installation Manuelle

Prérequis

  • Java 21 ou supĂ©rieur
  • Gradle (optionnel, le wrapper est inclus)

Construction du projet

# Sur Windows
.\gradlew.bat build

# Sur Linux/Mac
./gradlew build

Le fichier JAR sera généré dans build/libs/algo-compiler-1.0.0.jar

Utilisation manuelle

java -jar build/libs/algo-compiler-1.0.0.jar fichier.algo

Syntaxe

Structure de base

algorithme NomAlgorithme

// Déclaration des variables
variables
    x, y : entier
    nom : chaine
    resultat : reel

// Déclaration des constantes (optionnel)
constantes
    PI : reel = 3.14159
    MAX : entier = 100

début
    // Votre code ici
fin

Note : Vous pouvez utiliser les abréviations var pour variables et const pour constantes.

Types de données

  • entier : Nombres entiers
  • reel : Nombres Ă  virgule flottante
  • chaine : ChaĂ®nes de caractères
  • caractere : Caractère unique (dĂ©limitĂ© par des quotes simples)
  • booleen : Vrai ou Faux

Commentaires

Le compilateur supporte trois types de commentaires :

// Commentaire sur une seule ligne avec //

# Commentaire sur une seule ligne avec #

/* 
   Commentaire
   sur plusieurs lignes
*/

Constantes

Les constantes sont déclarées avec une valeur initiale et ne peuvent pas être modifiées :

constantes
    PI : reel = 3.14159
    MAX_VALEUR : entier = 100
    APP_NAME : chaine = "Mon Application"

début
    écrire(PI)          // OK - Lecture autorisée
    PI := 3.14          // ERREUR - Modification interdite
fin

Affectation

x := 10
nom := "Alice"

Caractères

Les caractères sont délimités par des guillemets simples (') :

variables
    lettre : caractere
    tableau_lettres : tableau[5] de caractere

début
    // Affectation simple
    lettre := 'A'
    
    // Caractères spéciaux avec échappement
    lettre := '\n'  // Nouvelle ligne
    lettre := '\t'  // Tabulation
    lettre := '\''  // Apostrophe
    lettre := '\\'  // Backslash
    
    // Tableau de caractères
    tableau_lettres[0] := 'H'
    tableau_lettres[1] := 'e'
    tableau_lettres[2] := 'l'
    tableau_lettres[3] := 'l'
    tableau_lettres[4] := 'o'
    
    // Comparaison de caractères
    si 'A' < 'B' alors
        écrire("A vient avant B")
    finsi
fin

Tableaux

Déclaration et utilisation de tableaux :

variables
    nombres : tableau[10] de entier
    notes : tableau[5] de reel
    noms : tableau[3] de chaine

début
    // Accès et modification d'éléments
    nombres[0] := 100
    nombres[1] := 200
    
    // Lecture dans un tableau
    lire(notes[0])
    
    // Affichage depuis un tableau
    écrire("Premier nombre:", nombres[0])
    
    // Parcours d'un tableau avec une boucle
    pour i de 0 Ă  9 faire
        nombres[i] := i * 10
    finpour
fin

Entrée/Sortie

Affichage

La fonction ecrire n'ajoute PAS de saut de ligne automatiquement — elle écrit exactement les valeurs passées. Pour ajouter un saut de ligne automatique utilisez ecrireln. Vous pouvez aussi insérer des retours à la ligne ou des tabulations à l'intérieur des chaînes avec les séquences d'échappement \n et \t.

// Affichage sans saut de ligne
ecrire("Bonjour ")
ecrire("monde")  // Affiche: Bonjour monde

// Affichage avec saut de ligne
ecrireln("Ligne 1")
ecrireln("Ligne 2")

// Échappements
ecrire("Ligne 1\nLigne 2")  // Saut de ligne
ecrire("Col1\tCol2")         // Tabulation

Lecture

La fonction lire lit l'entrée utilisateur sans afficher de prompt automatique. Vous devez utiliser ecrire() avant lire() pour créer votre propre message d'invite :

// ✅ CORRECT - Créer son propre prompt
ecrire("Entrez votre nom: ")
lire(nom)

ecrire("Entrez votre âge: ")
lire(age)

// Lecture dans un tableau
ecrire("Entrez la note 1: ")
lire(notes[0])

// Écriture : pas de saut de ligne par défaut
ecrire("Bonjour", nom)         // n'ajoute pas de '\n' Ă  la fin

// Pour forcer un saut de ligne :
ecrireln("Bonjour")            // ajoute un saut de ligne

// Ou inclure '\n' dans une chaîne :
ecrire("Ligne 1\nLigne 2")

// Tabulations avec \t
ecrire("Col1\tCol2\tCol3")

// Écriture avec plusieurs valeurs (concaténation automatique)
ecrire("x = ", x, ", y = ", y)

Remarque : ecrireln() sans argument écrit simplement une ligne vide (saut de ligne).

Conditions

si x > 0 alors
    ecrire("Positif")
sinon
    ecrire("Négatif ou nul")
finsi

Boucles

Boucle Pour

pour i de 1 Ă  10 faire
    ecrire(i)
finpour

Boucle TantQue

tantque x < 100 faire
    x := x + 1
fintantque

Boucle Répéter/Jusqu'à

répéter
    x := x + 1
jusqu'Ă  x > 10

Opérateurs

Arithmétiques

  • + : Addition
  • - : Soustraction
  • * : Multiplication
  • / : Division rĂ©elle (retourne un nombre rĂ©el)
  • div : Division entière (retourne le quotient)
  • mod : Modulo (retourne le reste de la division)

Exemple :

a := 17
b := 5

x := a / b      // x = 3.4 (division réelle)
q := a div b    // q = 3 (quotient)
r := a mod b    // r = 2 (reste)

Comparaison

  • = : Égal
  • <> ou != : DiffĂ©rent
  • < : InfĂ©rieur
  • > : SupĂ©rieur
  • <= : InfĂ©rieur ou Ă©gal
  • >= : SupĂ©rieur ou Ă©gal

Logiques

  • et : ET logique
  • ou : OU logique
  • non : NON logique

Exemple :

si x > 0 et x < 100 alors
    ecrire("x est entre 0 et 100")
finsi

si non (a = b) alors
    ecrire("a et b sont différents")
finsi

Fonctions et Procédures

Fonctions

Les fonctions retournent une valeur et peuvent avoir des paramètres :

fonction somme(a : entier, b : entier) : entier
debut
    retourner a + b
fin

fonction carre(x : reel) : reel
debut
    retourner x * x
fin

// Appel de fonction
variables
    resultat : entier
debut
    resultat := somme(5, 10)
    ecrire("Résultat:", resultat)
fin

Procédures

Les procédures n'ont pas de valeur de retour :

procédure afficherMessage(nom : chaine)
debut
    ecrire("Bonjour", nom, "!")
fin

// Appel de procédure
debut
    afficherMessage("Alice")
fin

Variables locales dans les fonctions

Les fonctions peuvent avoir leurs propres variables locales :

fonction calcul() : entier
variables
    temp, resultat : entier
debut
    temp := 10
    resultat := temp * 2
    retourner resultat
fin

Tableaux comme paramètres

Les fonctions peuvent accepter des tableaux en paramètre :

fonction maximum(arr : tableau de entier, taille : entier) : entier
variables
    i, max : entier
debut
    max := arr[0]
    pour i de 1 Ă  taille - 1 faire
        si arr[i] > max alors
            max := arr[i]
        finsi
    finpour
    retourner max
fin

// Utilisation
variables
    notes : tableau[5] de entier
    maxNote : entier
debut
    // ... initialiser le tableau ...
    maxNote := maximum(notes, 5)
    ecrire("Note maximale:", maxNote)
fin

Fonctions intégrées

Le compilateur inclut une bibliothèque de fonctions prêtes à l'emploi :

Fonctions mathématiques

  • abs(x) : Valeur absolue
  • racine(x) : Racine carrĂ©e
  • puissance(x, y) : x Ă  la puissance y
  • arrondi(x) : Arrondi au plus proche
  • plancher(x) : Arrondi infĂ©rieur (floor)
  • plafond(x) : Arrondi supĂ©rieur (ceil)
  • min(a, b) : Minimum de deux valeurs
  • max(a, b) : Maximum de deux valeurs
  • reste(a, b) : Reste de la division (Ă©quivalent Ă  mod)
  • quotient(a, b) : Quotient de la division entière (Ă©quivalent Ă  div)
  • sin(x) : Sinus (x en radians)
  • cos(x) : Cosinus (x en radians)
  • tan(x) : Tangente (x en radians)
  • log(x) : Logarithme naturel
  • exp(x) : Exponentielle

Exemples :

x := abs(-5.7)                      // x = 5.7
y := racine(16)                     // y = 4.0
z := puissance(2, 8)                // z = 256.0
a := arrondi(3.7)                   // a = 4
b := plancher(3.7)                  // b = 3
c := plafond(3.7)                   // c = 4
petit := min(5, 10)                 // petit = 5
grand := max(5, 10)                 // grand = 10
r := reste(17, 5)                   // r = 2
q := quotient(17, 5)                // q = 3
hypotenuse := racine(puissance(3, 2) + puissance(4, 2))  // hypotenuse = 5.0

Fonctions de chaînes

  • longueur(s) : Longueur d'une chaĂ®ne
  • majuscule(s) : Convertir en majuscules
  • minuscule(s) : Convertir en minuscules
  • sousChaine(s, debut, fin) : Extraire une sous-chaĂ®ne (de l'index debut Ă  fin)
  • estVide(s) : VĂ©rifie si une chaĂ®ne est vide
  • contient(s, sous_chaine) : VĂ©rifie si s contient sous_chaine
  • commence(s, prefixe) : VĂ©rifie si s commence par prefixe
  • termine(s, suffixe) : VĂ©rifie si s termine par suffixe
  • position(s, sous_chaine) : Trouve la position d'une sous-chaĂ®ne (-1 si non trouvĂ©e)

Exemples :

s := "Bonjour"
longueurS := longueur(s)            // longueurS = 7
maj := majuscule(s)                 // maj = "BONJOUR"
min := minuscule(s)                 // min = "bonjour"
sous := sousChaine(s, 0, 3)         // sous = "Bon"
vide := estVide("")                 // vide = vrai
trouve := contient("Hello", "ell")  // trouve = vrai
debut := commence("Hello", "Hel")   // debut = vrai
fin := termine("Hello", "lo")       // fin = vrai
pos := position("Hello", "ll")      // pos = 2

Fonctions aléatoires

  • aleatoire() : Nombre alĂ©atoire entre 0.0 et 1.0
  • aleatoire(max) : Entier alĂ©atoire entre 0 et max-1
  • aleatoire(min, max) : Entier alĂ©atoire entre min et max-1

Exemples :

x := aleatoire()              // x entre 0.0 et 1.0
n := aleatoire(10)            // n entre 0 et 9
m := aleatoire(5, 15)         // m entre 5 et 14

Fonctions de caractères

  • ord(c) : Retourne le code ASCII d'un caractère (0-127)
  • chr(code) : Retourne le caractère correspondant Ă  un code ASCII
  • estLettre(c) : VĂ©rifie si c est une lettre (a-z, A-Z)
  • estChiffre(c) : VĂ©rifie si c est un chiffre (0-9)
  • estMajuscule(c) : VĂ©rifie si c est une lettre majuscule
  • estMinuscule(c) : VĂ©rifie si c est une lettre minuscule
  • versMajuscule(c) : Convertit un caractère en majuscule
  • versMinuscule(c) : Convertit un caractère en minuscule

Exemples :

c := 'A'
code := ord(c)                      // code = 65
lettre := chr(65)                   // lettre = 'A'

// Tests de caractères
test := estLettre('A')              // test = vrai
test := estChiffre('5')             // test = vrai
test := estMajuscule('A')           // test = vrai
test := estMinuscule('a')           // test = vrai

// Conversions
c := 'a'
maj := versMajuscule(c)             // maj = 'A'
c := 'Z'
min := versMinuscule(c)             // min = 'z'

// Décalage de caractère (chiffrement César simple)
c := 'A'
decale := chr(ord(c) + 3)           // decale = 'D'

// Vérifier si c'est une majuscule (méthode alternative)
si ord(c) >= ord('A') et ord(c) <= ord('Z') alors
    ecrire("C'est une majuscule")
finsi

Fonctions de conversion

  • versEntier(x) : Convertit une valeur en entier
  • versReel(x) : Convertit une valeur en rĂ©el
  • versChaine(x) : Convertit une valeur en chaĂ®ne

Exemples :

x := versEntier(3.7)                // x = 3
y := versReel(42)                   // y = 42.0
s := versChaine(123)                // s = "123"

Exemples

Exemple 1 : Calcul de factorielle

algorithme Factorielle

variables
    n, i, resultat : entier

début
    écrire("Entrez un nombre:")
    lire(n)
    
    resultat := 1
    pour i de 1 Ă  n faire
        resultat := resultat * i
    finpour
    
    écrire("Factorielle de", n, "=", resultat)
fin

Exemple 2 : Nombres pairs

algorithme NombresPairs

variables
    i : entier

début
    écrire("Les 10 premiers nombres pairs:")
    
    pour i de 1 Ă  10 faire
        écrire(i * 2)
    finpour
fin

Exemple 3 : Devine le nombre

algorithme DevineNombre

variables
    secret, essai, tentatives : entier

début
    secret := 42
    tentatives := 0
    
    répéter
        écrire("Devinez le nombre:")
        lire(essai)
        tentatives := tentatives + 1
        
        si essai < secret alors
            écrire("Trop petit!")
        sinon
            si essai > secret alors
                écrire("Trop grand!")
            finsi
        finsi
    jusqu'Ă  essai = secret
    
    écrire("Bravo! Trouvé en", tentatives, "tentatives")
fin

Exemple 4 : Utilisation de tableaux

algorithme TestTableaux

variables
    nombres : tableau[5] de entier
    i : entier

début
    // Initialiser le tableau
    pour i de 0 Ă  4 faire
        nombres[i] := i * 10
    finpour
    
    // Afficher le tableau
    écrire("Contenu du tableau:")
    pour i de 0 Ă  4 faire
        écrire("nombres[", i, "] =", nombres[i])
    finpour
fin

Exemple 5 : Fonctions avec tableaux

algorithme AnalyseNotes

fonction maximum(arr : tableau de entier, taille : entier) : entier
variables
    i, max : entier
début
    max := arr[0]
    pour i de 1 Ă  taille - 1 faire
        si arr[i] > max alors
            max := arr[i]
        finsi
    finpour
    retourner max
fin

fonction moyenne(arr : tableau de entier, taille : entier) : reel
variables
    i, somme : entier
    moy : reel
début
    somme := 0
    pour i de 0 Ă  taille - 1 faire
        somme := somme + arr[i]
    finpour
    moy := somme / taille
    retourner moy
fin

variables
    notes : tableau[5] de entier
    i, maxNote : entier
    moyNote : reel

début
    écrire("Entrez 5 notes:")
    
    pour i de 0 Ă  4 faire
        écrire("Note", i + 1, ":")
        lire(notes[i])
    finpour
    
    maxNote := maximum(notes, 5)
    moyNote := moyenne(notes, 5)
    
    écrire("Note maximale:", maxNote)
    écrire("Moyenne:", moyNote)
fin

Exemple 6 : Fonctions intégrées

algorithme TestFonctions

variables
    x, y, hypotenuse : reel
    s : chaine
    nombre : entier

début
    // Fonctions mathématiques
    x := 3
    y := 4
    hypotenuse := racine(puissance(x, 2) + puissance(y, 2))
    écrire("Hypoténuse:", hypotenuse)
    
    // Fonctions de chaînes
    s := "Bonjour"
    écrire("Longueur:", longueur(s))
    écrire("Majuscule:", majuscule(s))
    écrire("3 premiers caractères:", sousChaine(s, 0, 3))
    
    // Fonction aléatoire
    nombre := aleatoire(1, 100)
    écrire("Nombre aléatoire entre 1 et 99:", nombre)
fin

Exemple 7 : Utilisation des constantes

algorithme CalculCercle

constantes
    PI : reel = 3.14159

variables
    rayon : reel
    aire, circonference : reel

début
    écrire("Entrez le rayon du cercle:")
    lire(rayon)
    
    aire := PI * puissance(rayon, 2)
    circonference := 2 * PI * rayon
    
    écrire("Aire:", aire)
    écrire("Circonférence:", circonference)
fin

Notes importantes

Flexibilité syntaxique

  • Accents optionnels : Vous pouvez Ă©crire debut au lieu de dĂ©but, ecrire au lieu de Ă©crire
  • Casse insensible : Les mots-clĂ©s peuvent ĂŞtre Ă©crits en majuscules, minuscules ou mixte (DEBUT, debut, Debut)
  • AbrĂ©viations : var pour variables, const pour constantes
  • Affectation flexible : Vous pouvez utiliser := ou = pour l'affectation

Types de commentaires

  • // : Commentaire sur une seule ligne
  • # : Commentaire sur une seule ligne (style Python)
  • /* ... */ : Commentaire multi-lignes

Protection des constantes

Les constantes déclarées dans la section constantes ne peuvent pas être modifiées. Toute tentative de modification provoquera une erreur à l'exécution.

Portée des variables

  • Les variables globales sont dĂ©clarĂ©es au niveau de l'algorithme
  • Les fonctions et procĂ©dures peuvent avoir leurs propres variables locales
  • Les paramètres de fonctions sont locaux Ă  la fonction

Tableaux

  • Les tableaux sont indexĂ©s Ă  partir de 0
  • La taille du tableau doit ĂŞtre spĂ©cifiĂ©e lors de la dĂ©claration
  • Les tableaux peuvent ĂŞtre passĂ©s en paramètre aux fonctions

Fonctions intégrées

Le compilateur inclut 40 fonctions intégrées :

  • MathĂ©matiques (15) : abs, racine, puissance, arrondi, plancher, plafond, min, max, reste, quotient, sin, cos, tan, log, exp
  • ChaĂ®nes (9) : longueur, majuscule, minuscule, sousChaine, estVide, contient, commence, termine, position
  • Caractères (8) : ord, chr, estLettre, estChiffre, estMajuscule, estMinuscule, versMajuscule, versMinuscule
  • Conversions (3) : versEntier, versReel, versChaine
  • AlĂ©atoires (3 variantes) : aleatoire(), aleatoire(max), aleatoire(min, max)

Développement

Structure du projet

src/main/kotlin/com/algocompiler/
├── Main.kt           # Point d'entrée
├── Token.kt          # Définition des tokens
├── Lexer.kt          # Analyse lexicale
├── AST.kt            # Arbre syntaxique abstrait
├── Parser.kt         # Analyse syntaxique
└── Interpreter.kt    # Interpréteur

Évolutions techniques

Version 1.0.0 :

  • âś… Support complet des tableaux avec indexation
  • âś… Fonctions et procĂ©dures avec paramètres
  • âś… Gestion de la portĂ©e des variables (locale/globale)
  • âś… Passage de tableaux en paramètre
  • âś… Bibliothèque de fonctions intĂ©grĂ©es (mathĂ©matiques, chaĂ®nes, alĂ©atoires)
  • âś… Support des constantes avec protection contre la modification
  • âś… Commentaires multi-formats (//, #, /* */)
  • âś… OpĂ©rateurs div et mod pour les opĂ©rations entières
  • âś… FlexibilitĂ© syntaxique (accents optionnels, casse insensible)
  • âś… Variables locales dans les fonctions
  • âś… Expressions complexes et imbriquĂ©es

Exemples disponibles

Le dossier examples/ contient de nombreux exemples pour vous aider à démarrer :

Basiques :

  • hello.algo - Programme Hello World
  • factorielle.algo - Calcul de factorielle
  • nombres_pairs.algo - Affichage des nombres pairs

Intermédiaires :

  • devine_nombre.algo - Jeu de devinette simple
  • jeu_devine_nombre_avance.algo - Version avancĂ©e avec fonctions intĂ©grĂ©es
  • calculatrice.algo - Calculatrice avec fonctions intĂ©grĂ©es

Tests de fonctionnalités :

  • test_tableaux.algo - DĂ©monstration des tableaux
  • test_fonctions.algo - Fonctions et procĂ©dures
  • test_fonctions_integrees.algo - Toutes les fonctions intĂ©grĂ©es
  • test_complet.algo - Exemple complet avec tableaux et fonctions
  • test_commentaires_constantes.algo - Commentaires et constantes
  • test_constante_protection.algo - Protection des constantes
  • test_div_mod.algo - OpĂ©rateurs div et mod
  • test_casse.algo - InsensibilitĂ© Ă  la casse
  • test_caractere.algo - Type caractère (complet)
  • test_ord_chr.algo - Fonctions ord() et chr()
  • test_ecrire.algo - Fonctions ecrire et ecrireln

Séries d'exercices :

  • sĂ©rie01/ - Exercices de base
  • sĂ©rie03/ - Exercices avancĂ©s

Licence

Ce projet est sous licence MIT.