BrainFuck编译器

###BrainFuck编译器的java实现

#####Brainfuck简介

  • Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF。

  • 这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

    下面是这八种状态的描述,其中每个状态由一个字符标识:

  字符 含义

  > 指针加一

  < 指针减一

  + 指针指向的字节的值加一      - 指针指向的字节的值减一      . 输出指针指向的单元内容(ASCII码)

  , 输入内容到指针指向的单元(ASCII码)

  [ 如果指针指向的单元值为零,向前跳转到对应的]指令的次一指令处

  ] 如果指针指向的单元值不为零,向后跳转到对应的[指令的次一指令处

  (按照更节省时间的简单说法,”]”也可以说成“向后跳转到对应的”[“状态”。这两解释是一样的。)

  (第三种同价的说法,”[“意思是”向前跳转到对应的”]”“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。”)

   /**
     * BrainFuck 编译器
     *
     * @author: chenzhigang
     * @version:
     * date: 2014年8月25日
     * mailto: chenzhigang@foxmail.com
     * blog : http://chenzhigang.github.io/
     * review 
     */
    public class BrainFuckMachine {
        static int[] datas = new int[2048]; //状态区域
        static int p	= 0 ; //状态区域的指针
        static int pc 	=0; //命令的指针
        public static void main(String[] args) {
            //String code ="++++++++++[>++++++++++<-]>++++.+.";
            String code="++++++++++[>+++++++>++++++++++>+++>+<<<<-]"
                    + ">++.>+.+++++++..+++.>++."
                    + "<<+++++++++++++++.>.+++.------.--------.>+.>.";
            run(code);
        }
        public static void run(String code){
            char[] cmds = code.toCharArray();
            while(true){
                switch(cmds[pc]){
                case '>':
                    p++;
                    break;
                case '<':
                    p--;
                    break;
                case '+':
                    datas[p]++;
                    break;
                case '-':
                    datas[p]--;
                    break;
                case '.':
                    System.out.print((char)datas[p]);
                    break;
                case ',':
                    break;
                case '[':
                    if(datas[p] ==0){
                        findNext(cmds);
                    }
                    break;
                case ']':
                    if(datas[p] !=0){
                        findPre(cmds);
                    }
                    break;
                }
                pc++;
                if(pc > cmds.length-1){
                    System.out.println();
                    System.out.println("程序运行结束 !");
                    break;
                }
            }
        }
        /**
         * 向后找 ]
         * @param cmds
         */
        public static void findNext(char[] cmds){
            while(true){
                pc++;
                if(pc > cmds.length-1){
                    System.out.println("代码不符合语法规范");
                    return;
                }
                if(cmds[pc]==']'){
                    return;
                }

            }
        }

        /**
         * 向前找 [ 
         * @param cmds
         */
        public static void findPre(char[] cmds){
            while(true){
                pc--;
                if(pc < 0){
                    System.out.println("代码不符合语法规范");
                    return;
                }
                if(cmds[pc]=='['){
                    return;
                }
            }
        }
    }
chenzhigang /
Published under (CC) BY-NC-SA in categories Hadoop  tagged with vagrant