Skip to content

Instantly share code, notes, and snippets.

@Grahack
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Grahack/05bbb4ef5416442d96c5 to your computer and use it in GitHub Desktop.
Save Grahack/05bbb4ef5416442d96c5 to your computer and use it in GitHub Desktop.
Proto d’interpréteur BF en MicroAlg http://microalg.info
(!!! "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