Last active
August 29, 2015 14:08
-
-
Save Grahack/05bbb4ef5416442d96c5 to your computer and use it in GitHub Desktop.
Proto d’interpréteur BF en MicroAlg http://microalg.info
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(!!! "Interpréteur pour http://fr.wikipedia.org/wiki/Brainfuck") | |
(Definir (Recherche_dans liste element) | |
"Retourne la position du dernier élément de `liste` valant `element`. | |
Retourne 0 si aucun élément n’est trouvé." | |
"ProfGra" | |
(Initialiser position_element 0) | |
(Initialiser position 1) | |
(Faire | |
(Si (= element (Nieme liste position)) | |
Alors (Affecter_a position_element position) | |
) | |
(Affecter_a position (+ 1 position)) | |
Tant_que (<= position (Longueur liste)) | |
) | |
(Retourner position_element) | |
) | |
(Definir (BF src) | |
"Exécute le code BF dans le paramètre `src` (texte)." | |
"ProfGra" | |
(Initialiser ruban (Liste 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) | |
(!!! "`ptr` pour «pointeur»") | |
(Initialiser ptr_ruban 1) | |
(Initialiser ptr_crochet 1) | |
(Initialiser caractere "") | |
(Initialiser ptr_src 1) | |
(!!! "Tout d’abord la mise en place (position des crochets).") | |
(!!! "Les positions des crochets de `src` sont stockées dans deux listes :") | |
(!!! "`co` et `cf`, pour « crochets ouvrants » et « crochets fermants ».") | |
(Initialiser co (Liste)) | |
(Initialiser cf (Liste)) | |
(!!! "`liste_niveaux` contient le niveau ouvert par chaque crochet ouvrant.") | |
(Initialiser niveau 0) | |
(Initialiser liste_niveaux (Liste)) | |
(Tant_que (<= ptr_src (Longueur src)) | |
Faire | |
(Affecter_a caractere (Nieme src ptr_src)) | |
(Si (= caractere "[") | |
Alors | |
(Affecter_a niveau (+ niveau 1)) | |
(Ajouter_a co ptr_src) | |
(Ajouter_a cf 0) | |
(Ajouter_a liste_niveaux niveau) | |
) | |
(Si (= caractere "]") | |
Alors | |
(Affecter_a cf ptr_src En_position (Recherche_dans liste_niveaux niveau)) | |
(Affecter_a niveau (- niveau 1)) | |
) | |
(Affecter_a ptr_src (+ 1 ptr_src)) | |
) | |
(!!! "Ensuite l’interpréteur en lui-même.") | |
(Initialiser sortie "") | |
(Affecter_a ptr_src 1) | |
(Affecter_a ptr_crochet 1) (!!! "Le premier crochet rencontré est ouvrant.") | |
(Tant_que (<= ptr_src (Longueur src)) | |
Faire | |
(Affecter_a caractere (Nieme src ptr_src)) | |
(Si (= caractere ">") | |
Alors (Si (= ptr_ruban (Longueur ruban)) Alors (quit "Ruban trop petit à droite.")) | |
(Affecter_a ptr_ruban (+ ptr_ruban 1)) | |
) | |
(Si (= caractere "<") | |
Alors (Si (= ptr_ruban 1) Alors (quit "Ruban trop petit à gauche.")) | |
(Affecter_a ptr_ruban (- ptr_ruban 1)) | |
) | |
(Si (= caractere "+") | |
Alors (Affecter_a ruban (+ (Nieme ruban ptr_ruban) 1) En_position ptr_ruban) | |
) | |
(Si (= caractere "-") | |
Alors (Affecter_a ruban (- (Nieme ruban ptr_ruban) 1) En_position ptr_ruban) | |
) | |
(Si (= caractere ".") | |
Alors (Ajouter_a sortie (char (Nieme ruban ptr_ruban))) | |
) | |
(Si (= caractere ",") | |
Alors (Affecter_a ruban (char (Demander)) En_position ptr_ruban) | |
) | |
(Si (= caractere "[") | |
Alors (Si (= 0 (Nieme ruban ptr_ruban)) | |
Alors | |
(Affecter_a ptr_crochet (Recherche_dans co ptr_src)) | |
(Affecter_a ptr_src (Nieme cf ptr_crochet)) | |
) | |
) | |
(Si (= caractere "]") | |
Alors (Si (=/ 0 (Nieme ruban ptr_ruban)) | |
Alors | |
(Affecter_a ptr_crochet (Recherche_dans cf ptr_src)) | |
(Affecter_a ptr_src (Nieme co ptr_crochet)) | |
) | |
) | |
(Affecter_a ptr_src (+ 1 ptr_src)) | |
) | |
(Retourner sortie) | |
) | |
(Afficher (BF "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")) | |
(Afficher (BF "[-]>[-]>[-]+++>[-]+++++<[>[<<+<+>>>-]<<[>>+<<-]>-]>[-]<<[-]<")) | |
(Afficher ruban) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment