###### tags: `Tag(Projet - Compilateur - AsciiArc)`
# Projet Compilateur - AsciiArc

# Informations générales
| Titre | AsciiArc|
| ------------- |:-------------:|
| Version | 1.0 |
| Superviseurs | François Tièche Francois.Tieche@he-arc.ch |
| Étudiants | Perrin Lucas Lucas.Perrin1@he-arc.ch<br/> Rui Marco Loureiro Rui.Loureiro@he-arc.ch<br/> Miguel Moreira Miguel.Moreira@he-arc.ch |
| Date de début | - |
| Date de fin | 14 janvier 2022 à 18h |
# Cahier des charges
Titre "**AsciiArc**"
Ce projet a pour objectif de réaliser un **interpreteur** en python avec la bibliothèque PLY (Python Lex-Yacc).
## Programme
### **Exemple de code input** :
```python
# Défini le canevas de dessin
dessin(tailleX : 500, tailleY : 500, couleurFondSol : "#ff5733", couleurFondCiel : "#f55d3d", couleurFond : "#b2918a" )
# Ajoute les éléments prédéfinis ("voiture, camion, ...") sur le canevas (sans les afficher)
add(type : "Voiture", couleurCaractère : "#b2918a", positionIndex: 1);
# Si la grille de dessin possède une grande taille, on peut envisager de créer un deuxième objet au même niveau.
add(type : "Moto", couleurCaractère : "#b2918a", positionIndex: 2);
# Défini le type de caractère (clair, par défaut, sombre) avec sa couleur
setSol(densité : "clair", couleurCaractère : "#cb6852")
setCiel(densité : "sombre", couleurCaractère : "#f55d3d")
# Parcours tous les éléments V1
foreach(element in getElements())
{
affiche(element);
sleep(temps : 500);
}
# Affiche tous les éléments, si le tableau n'est pas trié on n'obtient pas ce qu'on veut... Avertissement
elements = getElements()
for (i = 0, i <= elementsSize(), i++)
{
if (i == elements[i].positionIndex)
{
affiche(element[i]);
sleep(temps : 500);
}
}
```
#### Densités disponibles
| Clair | Par défaut | Sombre |
| -------- | -------- | -------- |
| . | * | # |
#### Types disponibles
* Moto
* Voiture
* Camion
Exemples tirés de https://www.asciiart.eu/vehicles
```
,-~ |
________________ o==]___|
| | \ \
|________________| /\ \
__ / _,-----._ ) | \ \.
|_||/_-~ `. /() | /|]_|_____
|// \ | \/ /_-~ ~-_
//________________|| / //___________\
//__|______________| \____________/ //___/-\ \~-_
((_________________/_-o___________/_//___/ /\,\ \
|__/( ((====)o===--~~ ( ( (o/) )
\ ``==' / \ `--' /
`-.__,-' Vespa P-200 E `-.__,-'
____________________
//| | \
// | | \
___________//____|___________|__________()\__________________
/__________________|_=_________|_=___________|_________________{}
[ ______ | | . | == ______ { }
__[__ /## ##\| | | /## ##\ _{# }_
{_____)______|## ##|___________|_____________|___|## ##|__(______}
/ ##__## / ##__## \
_.--,_......----..__
\ .' ' ```--...__ \
\; ' . '. ||
: ' ' \ .''.
.'; : ' .| |.--..___
/ \ | : :| /.------.\
/ .'._ : | || || |\\
/.-. /|-| `-. : ;| ||______|_\`.______
// // |-| \ ' ' / | ||=' | | `.
// //\\|-| `-._' ' .' | || | | \
/.-.// \\-|_________```------------` ___'. || | '_.--. <)
'._.' / .-----. .-----. .''''''''. |'--..____| / _ \ |
|_/.' '.\_/.' '.\_[ [ [ ] ] ]___|_________.'.' '.\ ]
: .-. : : .-. : '........' (_________): .-. :`-'
: '-' : : '-' : : '-' :
'._ _.' '._ _.' '._ _.'LGB
```
### **Output** du programme:
Le résultat représenterait une petite animation de l'object animé dans son décor, tout ça dans une interface graphique.
## Analyse lexicale
| Symbole | Règle |
| -------- | -------- |
| () | parenthesis |
| add, draw, show, sleep, setFloor, setSky, getElements | function |
| <,<=,>,>= | operator |
| = | affectation |
| ++ | unary_operator |
| {} | brackets |
| ; | end_statement |
| foreach, for, in | reserved |
| , | separator |
| . | point |
| "" | text |
| # | comment |
## Analyse syntaxique
https://www.lysator.liu.se/c/ANSI-C-grammar-y.html --> grammar
https://www.lysator.liu.se/c/ANSI-C-grammar-l.html --> lex specification
| Nom | Règle |
| --------- | ------------------------------------------------- |
| program | statement |
| program | statement ';' program |
| statement | structure |
| statement | assignment |
| statement | function |
| structure | FOREACH '(' variable IN array ')' '{' program '}' |
| structure | FOR '(' variable '=' number ';' variable operator number ';' variable unary_operator')' '{' program '}' |
number | 0-9
variable | a-z
operator | < ou > ou >= ou <=
unary_operator | ++ ou --