项目作者: TristanEduProjet

项目描述 :
Compilateur d'un mini-langage
高级语言: C
项目地址: git://github.com/TristanEduProjet/CoinLang.git
创建时间: 2017-05-22T09:27:11Z
项目社区:https://github.com/TristanEduProjet/CoinLang

开源协议:

下载


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 :

  1. 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) :

  1. 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

  • affectation des variables “simples” à un caractère
  • gestion des variables (nom complet)
    • affectation
    • récupération/accès (valeur)
  • reconnaissance des types :
    • nombres réels (flottant) : x.x, x.xEx, xEx, .x, .xEx, Xf, Xlf
    • nombres entiers
    • chaine de caractères (avec (certain) échappement caractères spéciaux)
    • boolean (true, false)
  • calcul numérique de nombres (+, -, *, /, ^)
  • expression booléennes :
    • not, and, or, xor
    • ==, !=, >, >=, <, <=
  • remplacement de l’arbre stockant le programme généré par Yacc par une liste chainée modulaire
  • notion de “bloc” d’instruction(s) pour de futures fonctionnalités
  • instructions de base :
    • if et else

Fonctionnalités à venir

  • instructions de base :
    • if ternaires (bug)
    • for
    • while
    • switch
  • gestion basique de l’output
  • gestion des fonctions
  • vérification de la conformité des types (entre variables et fonctions)

Fonctionnement interne

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

  • Lecture et reconnaissance des paramètres
  • Lecture du fichier source
  • Affichage de la structure obtenue
  • Vérification du programme obtenu
  • Exécution du programme

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) :

  • La vérification
  • L’affichage (dump)
  • L’exécution

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

Utilisation

  1. $> minicoin --help
  2. Usage: minicoin [-h|--help] [--version] [-v|--verbose] [--silent] [--show-instru
  3. cts={y,yes,n,no}] [--dump-session={y,yes,n,no}] -f|-i|--file|--input|--in=<src>
  4. Full command-line of minicoin.
  5. -h, --help display this help and exit
  6. --version display version info and exit
  7. -v, --verbose verbose output
  8. --silent silent output
  9. --show-instructs={y,yes,n,no}
  10. show program obtain
  11. --dump-session={y,yes,n,no}
  12. dump session after execution
  13. (show variables and functions)
  14. -f, -i, --file, --input, --in=<src>
  15. 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 :

  1. git submodule update --init

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

  1. # mise à jour du dépôt parent
  2. git fetch
  3. # mise à jour du sous-module sur le bon commit
  4. 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.