Compilateur d'un mini-langage
Compilateur d’un mini-langage
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
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) :
- Votre interpréteur devra gérer les noms de variables à plusieurs caractères.
- Prendre en compte le type réel
- Gérer les instructions suivantes :
a. affectation
b. affichage d’expressions numériques (pouvant contenir des variables numériques)
c. instructions conditionnelles : implémenter lesi-alors-sinon
/si-alors
d. structures itératives : implémenter lewhile
et lefor
e. Affichage de l’arbre de syntaxe et de la table des variablesAméliorations possibles (entre autre):
- Gestion des erreurs (variable non initialisée, …)
- Gestion de la saisie clavier
- Gestion du type chaine de caractères (et extension d’autant de l’instruction d’affichage)
- Gérer les fonctions
- Gérer la déclaration explicite des variables
- Gérer la portée des variables et les fonctions récursives
- Les pointeurs
- Les tableaux
- la POO
x.x
, x.xEx
, xEx
, .x
, .xEx
, Xf
, Xlf
true
, false
)+
, -
, *
, /
, ^
)not
, and
, or
, xor
==
, !=
, >
, >=
, <
, <=
if
et else
if
ternaires (bug)for
while
switch
L’exécution du se sépare en 3 phases majeures :
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.
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.
$> 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
Le compilateur est construit à l’aide de Flex) et Bison, forks récents de Lex) et Yacc).
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.
Librairie pour gérer les arguments du programme.
En remplacement à Getopt de GNU qui est plus long.
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.
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.