TristanEduProjet / CoinLang

Compilateur d'un mini-langage
1 stars 0 forks source link
bison c flex lex yacc

CoinLang

Compilateur d'un mini-langage

GitHub release GitHub Releases GitHub All Releases
Unix : CircleCI Windows : Build status

Récupération du dépôt Git

Ce dépôt dépends de sous-module(s). Pour pouvoir les récupérés en un coup avec le dépôt, la commande est :

git clone --recursive git@github.com:TristanEduProjet/CoinLang.git

Si le dépôt est déjà cloné, exécuter la commande suivante (si le dossier du module est vide) :

git submodule update --init --recursive

Sujet

Listes des fonctionnalités voulues : L’objectif du projet est de concevoir un interpréteur pour un mini langage. Il est obligatoire de baser l’interprétation sur un arbre de syntaxe abstrait construit au cours de l’analyse syntaxique du « programme » donné en entrée.
Le projet doit vous permettre d’acquérir les compétences suivantes :

  • générer des analyseurs lexicaux et syntaxiques avec lex et yacc
  • construire un arbre de syntaxe abstrait à partir d'un arbre concret
  • interpréter la chaine d'entrée (le programme) en évaluant l'arbre de syntaxe abstrait correspondant.

Spécifications de la version minimale (11/20) :

  1. Votre interpréteur devra gérer les noms de variables à plusieurs caractères.
  2. Prendre en compte le type réel
  3. Gérer les instructions suivantes : a. affectation b. affichage d’expressions numériques (pouvant contenir des variables numériques) c. instructions conditionnelles : implémenter le si-alors-sinon/si-alors d. structures itératives : implémenter le while et le for e. Affichage de l’arbre de syntaxe et de la table des variables

Améliorations possibles (entre autre):

  1. Gestion des erreurs (variable non initialisée, …)
  2. Gestion de la saisie clavier
  3. Gestion du type chaine de caractères (et extension d’autant de l’instruction d’affichage)
  4. Gérer les fonctions
  5. Gérer la déclaration explicite des variables
  6. Gérer la portée des variables et les fonctions récursives
  7. Les pointeurs
  8. Les tableaux
  9. la POO

Fonctionnalités implémentées

Fonctionnalités à venir

Fonctionnement interne

L’exécution du se sépare en 3 phases majeures :

Lecture / Parser

Le fichier source est traité par Yacc qui fait appel à Lex pour lire le fichier. Ce dernier converti le fichier en token reconnaissable par Yacc qui vérifie et applique la grammaire du langage.

Structure du programme généré

Le programme du script utilisateur est stockée sous une forme modulaire.
Cela permet une gestion dynamique et plus souple du programme dans sa globalité.

Chaque instruction se calque sur une interface commune et définie comme elle doit être lue, évaluée, etc...
Cela concerne (au niveau le plus abstrait) :

Cela permettra plus tard la mise en place d'optimisation plus facile.

Utilisation

$> minicoin --help
Usage: minicoin [-h|--help] [--version] [-v|--verbose] [--silent] [--show-instru
cts={y,yes,n,no}] [--dump-session={y,yes,n,no}]  -f|-i|--file|--input|--in=<src>

Full command-line of minicoin.

  -h, --help                display this help and exit
      --version             display version info and exit
  -v, --verbose             verbose output
      --silent              silent output
      --show-instructs={y,yes,n,no}
                            show program obtain
      --dump-session={y,yes,n,no}
                            dump session after execution
                            (show variables and functions)
  -f, -i, --file, --input, --in=<src>
                            source file

Dépendances

Lex & Yacc

Le compilateur est construit à l'aide de Flex et Bison, forks récents de Lex et Yacc.

Modules Git

Certaines dépendances de ce dépôt sont des modules Git (un lien vers des dépôts extérieures).
Si le sous-modules est vide la première fois, il faut l'initialiser :

git submodule update --init

Si des mises à jour / commits viennent plus tard sur un sous-module, il faut faire dans l'ordre :

# mise à jour du dépôt parent
git fetch

# mise à jour du sous-module sur le bon commit
git submodule update

Pour plus de détail, consultez le wiki.

Argtable3

Librairie pour gérer les arguments du programme.
En remplacement à Getopt de GNU qui est plus long.

SGLIB

A Simple Generic Library for C Website Documentation FreeCode

Librairie simple & générique de structure de base en C.
Sa particularité est de n'utilisée que les macro (ou préprocesseur), et s'adapte donc au type contenu.

Klib

Dans la même idée que SGLib, une librairie très légère reposant sur les macro pour de bonne performances et une adaptation aux types.
Avec quelques extensions qui ne nous sont pas nécessaire ici.