Ce projet est la partie backend d'un compilateur pour le langage MiniPython. Ainsi, il contient un lexer pour l'analyse lexicale et un parser pour l'analyse syntaxique.
- Léo BERNARD
- Lucie CORREIA
- Garance FROLLA
- Maï MORVAN
Après avoir fait les automates sur papier, nous les avons implémentés en plusieurs parties en se partageant les sous-automates. L'automate Lexer execute le code associé à l'automate adapté en fonction de ce qu'il lit.
Une fois la grammaire rendue LL1, nous avons accès à la table LL1 sur grammophone. Nous avons décidé de représenter les indices des non terminaux et des terminaux sous formes de dictionnaires. Les clés sont les non terminaux et les terminaux et les valeurs sont les indices associés.
Par exemple, dans la table LL1, la première case en haut à gauche est la case ("NEWLINE1","newline") = (0,0). On accède à cette case lorsque le terminal lu est "newline" et le non terminal au sommet de la pile est "NEWLINE1"
Un arbre syntaxique est généré avec la librairie graphviz pour chaque programme. Il suit simplement les règles de la grammaire de la Table et affiche les noeuds en fonction.
Les fonctions sémantiques sont des fonctions liées à l'analyse sémantique du code. Ces fonctions permettent donc de construire un arbre syntaxique abstrait, qui contient les informations principales de l'arbre syntaxique. Pour cela, nous utilisons un pile qui va garder en mémoire les informations nécessaires pour construire l'arbre syntaxique abstrait. On associe à la table, une fonction sémantique par règle de la grammaire.
Par exemple, pour la règle FILE -> NEWLINE1, on récupère les éléments de la pile comme les déclarations, les fonctions et la racine de l'abre et on ajoute les fonctions et les déclarations à> Pour rappel, l'abre syntaxique abstrait est crée de bas en haut, contrairement à l'arbre abstrait qui est crée de haut en bas. Ainsi la fonction sémantique associée à la règle de l'axiome e>
On dénombre environ 70 fonctions sémantiques pour l'ensemble des règles de la grammaire, sachant que certaines règles sont similaires, voir totalement identiques et certaines ne font rien.
Certaines règles, comme celles qui traitent les opération de listes, sont plus complexes et nécéssitent
L'arbre syntaxique abstrait est ensuite affiché avec la librairie graphviz. Il pourrait alors permettre par la suite de générer du code intermédiaire.
- [Language/Tool Version(s)]: Ensure you have graphviz, java 21 and gradle installed.
$ sudo apt-get install graphviz
$ sudo apt-get install openjdk-21-jdkPlease install Java 21 and graphviz. Add them both to the PATH environment variable.
Clone the repository and install any required dependencies:
$ git clone https://gibson.telecomnancy.univ-lorraine.fr/projets/2425/compil/pcl-grp05.git
$ cd pcl-grp05
$ ./configure
$ ./gradlew build #for the first time
$ ./gradlew run --args="chemin/vers/votre/fichier.mpy"To compile a mini-python (.mpy) source file:
$ ./gradlew run --args="chemin/vers/votre/fichier.mpy"Here are some sample programs you can compile using our compiler :
- Hello World:
// Example code for Hello World in Mini Python
print ("Hello World")
- Fibonacci Sequence:
//Example code for Fibonacci in Mini Python
def fibonacci_recursive(n):
if n <= 0:
return 0
if n == 1:
return 1
else:
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
# Exemple d'utilisation (obligatoire pour avoir un bloc)
print(fibonacci_recursive(10)) # 55
For more examples, refer to the resources/ directory.
To run tests, make sure you have junit supported :
$ ./gradlew testYou can also add specific test cases in the test/ folder and run them with:
$ ./gradlew test --tests [your-class-test]
If you encounter any issues or have feature requests, please open an issue on the Gibson repository.
- Libraries used in this project : graphviz
- Special thanks to Olivier Festor, Léo Bernard, Maï Morvan, Lucie Correia et Garance Frolla