Resultados 1 a 4 de 4

Tópico: Interpretador de Brainfuck

  1. #1
    Membro ingresso Avatar de hacker_wap
    Data de Ingresso
    Feb 2009
    Posts
    152
    Post Thanks / Like

    Lightbulb Interpretador de Brainfuck



    Segue um interpretador de Brainfuck que eu fiz em Coffeescript para matar o tempo.
    Código hospedado no Pastebin.
    Código:
    class BFI
        cell_max = 128
        cell_min = -128
        cell_start = 0
        stack = []
        stack_max = 2048
        sp = 0
        code = ''
        cp = 0
        loops = []
        output = ''
        comment = ''
        
        constructor: ->
    
    
        reset:->
            stack = []
            sp = 0
            loops = []
            output = ''
            comment = ''
            cp = 0
            return
        
        load:(c)->
            code = c
            @reset()
            return
    
    
        next:->
            if cp >= code.length then return -1
    
    
            if sp == stack.length then stack.push(cell_start)
    
    
            switch code.charAt(cp)
                when '+'
                    stack[sp]++
                    if stack[sp] > cell_max then stack[sp] = cell_min
                when '-'
                    stack[sp]--
                    if stack[sp] < cell_min then stack[sp] = cell_max
                when '>'
                    sp++
                    if sp > stack_max then sp = 0
                when '<'
                    sp--
                    if sp < 0 then sp = stack_max
                when '['
                    if not stack[sp] then cp = loopEnd()
                    loops.push(cp)
                when ']'
                    if not loops.length then throw "Found ] when no loop is open - " + cp
                    cp = loops.pop() - 1
                when '.'
                    output += String.fromCharCode(stack[sp])
                when ','
                    stack[sp] = input()
                else
                    comment += code.charAt(cp)
            return cp++
    
    
        run:(c)->
            if c then @load(c)
            while @next() != -1
                continue
            return output
    
    
        @run:(c)->
            bfi = new BFI()
            return bfi.run(c);
            
    
    
        input = ->
            if str = prompt('Input only one char') then return str.charCodeAt(0)
            return 0
    
    
        loopEnd = ->
            skip = 0
            for i in [(cp + 1)..code.length]
                switch code.charAt(i)
                    when '[' then skip++
                    when ']'
                        if not skip then return i
                        skip--
            throw "end of loop not found - " + cp
    
    
    alert(BFI.run('+++++++++[>++++++++<-]>.+.'))
    Site do Coffeescript caso queiram testar: http://coffeescript.org/

    Operadores da linguagem:

    • > Incrementa o ponteiro (acessa a célula de memória seguinte).
    • < Decrementa o ponteiro (acessa a célula de memória anterior).
    • + Incrementa em um, o valor da célula de memória selecionada.
    • - Decrementa em um, o valor da célula de memória selecionada.
    • . Imprime na tela o caractere relativo à célula de memória selecionada.
    • , Salva na célula de memória selecionada o código da próxima tecla a ser pressionada.
    • [ Estrutura de controle que repete os comandos, enquanto a célula selecionada for diferente de zero.
    • ] Fim da estrutura.

    Fonte: http://pt.wikipedia.org/wiki/Brainfuck#Comandos

    Hello Word
    Código:
    ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
    Fonte: http://en.wikipedia.org/wiki/Brainfuck#Hello_World.21
    Última edição por str0p; 22 Jan 2014 às 17:11.
    É melhor não dizer nada e pensarem que é bobo, do que abrir a boca e acabar com as duvidas.

  2. #2
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Cara eu não entendo nada de BF, incrementar decrementar ponteiro. Que ponteiro?

    Agora fazer um interpretador para uma linguagem estranho em um outra linguagem esquisita. Cara, você merece ouro mesmo.

    Acredito que o compilador dele não seja tão dificil.

    Valeu mesmo, parabens.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  3. #3
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Minha tentativa em Perl: http://pastebin.com/aEppcPKt
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  4. #4
    Membro ingresso Avatar de hacker_wap
    Data de Ingresso
    Feb 2009
    Posts
    152
    Post Thanks / Like
    Vou tentar simplificar.
    Imagine um array de 5000 posições, esse ponteiro é a posição atual que esta sendo acessada.

    Em breve vou ver se tento fazer um compilador, porem não creio que vá ser fácil
    É melhor não dizer nada e pensarem que é bobo, do que abrir a boca e acabar com as duvidas.

Tags para este Tópico

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •