Você está na página 1de 3

Universidade Federal de Ouro Preto - icea - decea

Prof.: Elton M. Cardoso CEA419 - Linguagens de Programa ca o Trabalho Pr atico II - Data de entrega: 21/03/2013

Um interpretador para Brainf


O objetivo deste trabalho pr atico e xar os conceitos e t ecnicas vistos em classe por meio da implementa c ao, em linguagem Haskell, de um interpretador para uma turing tarpit conhecida como Brainf. Turing tarpit s o linguagem com mesmo poder cmputacional da M aquina de Turing e que apresentam um conjunto m nimo de instru c oes ou comandos. Brainf foi inentada em 1993 por Urban M uller, cujo o objetivo era criar uma lingugem que pudesse ser implementada com o menor compilador poss vel. De fato existe um compilador implementado em apenas 100 bytes.

Linguagem Brainf

O modelo de m aquina utilizado por Brainfuck e simples. A m aquina que executa o c odigo possui um vetor de bytes e um ponteiro um endere co desse vetor. A instru c oes s ao descritas abaixo: Instru c ao > < + . , [ ] Signicado Avan ca o ponteiro uma unidade para direita Avan ca o ponteiro uma unidade para esquerda Incrementa o valor apontado pelo ponteiro em uma unidade Decrementa o valor apontado pelo ponteiro em uma unidade Imprime o valor apontado pelo ponteiro como caracter L e uma caracter e o armazenda o endere co referenciado pelo ponteiro Se o valor apontado pelo ponteiro for zero, ent ao salta todas as intru c oes adiante (a direita) at e instru c ao imediatamente ap os o ] correspondente. Se o valor apontado pelo ponteiro for diferente de zero, ent ao salta todas as intru c oes pr evias (a esquerda) at e instru c ao imediatamente ap os o [ correspondente. Tabela 1: Commandos da linguagem Brainf

A seguir apresenta-se um exemplo de um programa em Brainf


+++++ +++++ [ > +++++ ++ > +++++ +++++ > +++ > + <<<< ] > ++ . > + . +++++ ++ . . +++ . > ++ . << +++++ +++++ +++++ . > . +++ . ----- - . ----- --- . > + . > . initialize counter ( cell #0) to 10 use loop to set the next four cells to 70/100/30/10 add 7 to cell #1 add 10 to cell #2 add 3 to cell #3 add 1 to cell #4 decrement counter ( cell #0) print print print print print print print print print print print print print H e l l o W o r l d ! \n

Universidade Federal de Ouro Preto - icea - decea


Prof.: Elton M. Cardoso CEA419 - Linguagens de Programa ca o Trabalho Pr atico II - Data de entrega: 21/03/2013

Para a realiza c ao deste trabalho uma modelagem de um interpretador para Brainf j a foi feita. Juntamente com este enunciado h a m odulo Brainf.hs o qual cont em as deni c oes dos tipos de dados a serem utilizados e as assinaturas de tipo das fun c oes. A seguir relaciona-se as fun c oes a serem implementadas e os tipos denidos: type Fita = ([Char],Char,[Char]) Dena a representa c ao para uma ta de mem oria da m aquina de Brainf. Ao contr ario da M aquina de Turing, a ta e limitada e cont em inicialmente car acteres NUL. O tipo ta e representado por um terno onde o primeiro elemento e uma lista de car acteres j a percorridos, o segundo elemento e o caractere corrente (equivalente ao car acter referenciado pelo apontador). o terceiro elemento e uma lista de car acteres ainda n ao vistos. type Program = Fita Um programa e convenientemente representado como uma ta tamb em. type State = (Program,Fita) Um estado e um por ordenado formado por um programa e uma ta. As seguintes fun c oes devem se implementadas com os respectivos tipos anotados: 1. mr :: Fita -> Fita : Move a ta um car acter para direita. Ex.: mr (,a,"bcde") ("a",b,"cde") 2. ml:: Fita -> Fita : Move a ta um car acter para a esquerda. Ex.: ml ("cba",d,"e") ("ba",c,"de") 3. inc :: Fita -> Fita : Incrementa em uma unidade o car acter corrente na ta.Deve-se considerar como intervalo de car acteres v alidos os car ateres corresponde aos c odigos ASCII entre 0 e 255. Se o caracter corrente tiver o c odigo 255 inc deve mudar este car acter n ao para 256, mas sim para 0. Ex.: inc ("cba",d,"e") ("cba",e,"e") 4. dec :: rente. Fita -> Fita : An alogo a inc exceto que decrementa o valor do car acter corFita -> Char : Retorna o car acter corrente da ta.

5. current ::

6. backLoop :: Program -> Program: Retrocede na ta at e encontrar um marcador de in cio de la co [. Leva em considera c ao a exist encia de la cos aninhados. Ap os o termino desta fun c ao a cabe ca da primeira lista da ta deve ser [. Ex.: backLoop ("+-+[",],) ("[",+,-+]") 7. forwardLoop :: Program -> Program : Avan ca na ta at e encontrar um car acter marcador de m de la co ]. Ap os o t ermino da execu c ao desta fun c ao a cabe ca da lista na terceira posi c ao do par deve ser ].

Page 2

Universidade Federal de Ouro Preto - icea - decea


Prof.: Elton M. Cardoso CEA419 - Linguagens de Programa ca o Trabalho Pr atico II - Data de entrega: 21/03/2013

8. makeInitialState :: String -> State : Dada uma String s que cont em um programa, cria um estado inicial do seguinte modo: A programa e formado pelo terno ([],head s,tail s ++[\NUL]). A ta e formada pelo terno ([],\NUL, ys) onde ys e uma lista com 300 caracteres NUL. Um car acter \NUL e inserido ao m do programa com prop osito de facilitar a detec c ao do m da execu c ao do programa. A fun c ao de interpreta c ao interpreter :: State -> State deve considerar apenas o comando corrente, seja ele qual for. O processo de repeti c ao da interpreta c ao sobre os demais comandos e realizada pela fun c ao withInterpreter. A fun c ao interpreter deve se concentrar apenas nos comandos +,-,>,<,[ e ] deixando os comandos entrada e sa da . e , a cargo da fun c ao withInterpreter Uma vez que todas as fun c oes estiverem implementadas voc e pode executar o interpretador invocando o m etodo main no GHCi. O programa ir a ent ao solicitar um nome de arquivo que cont em c odigo em Brainfuck, o c odigo ser a lido e o interpretador ser a executado. Como usual seu c odigo dever a ser submetido ao e-mail eltonm.cardoso@gmail.com at ea data de 21/03/2013

Page 3