“Treehugger”编程语言的并行解释器无法按预期运行

时间:2015-06-07 17:06:53

标签: java interpreter

Treehugger是臭名昭着的Brainf ***编程语言的一种变体,它不是在磁带上运行,而是在无限向下的二叉树上运行。对于编程拼图和代码高尔夫堆栈交换的this question,我正在尝试为它编写一个并行解释器,它最终会输出语言中每个语法上有效的暂停程序,不包括那些需要输入和生成的程序。输出

出于某种原因,它似乎也省略了所有短于约5个字符的非空程序,同时还包括一些具有明显无效语法的程序。当然,在我开始打高尔夫球之前,这些问题需要解决。

以下是它的来源:

import java.util.*;

public class I{
    static class NODE{
        public NODE l=null,r=null;
        public byte v=0;
    }
    static class PROGRAM extends Stack<NODE>{
        public int i=0;
        public char[]s;
        public boolean h=false;
    }
    static void step(PROGRAM t){
        if(t.i>=t.s.length){
            t.h=true;return ;
        }
        char c=t.s[t.i];
        if(c=='<'){if(t.peek().l==null)t.peek().l=new NODE();t.push(t.peek().l);}
        if(c=='>'){if(t.peek().r==null)t.peek().r=new NODE();t.push(t.peek().r);}
        if(c=='^')t.pop();
        if(c=='+')t.peek().v++;
        if(c=='-')t.peek().v--;
        if(c=='['&&t.i==0){
            int i=1;
            while(i>0){
                t.i++;
                if(t.s[t.i]==']')i--;
                if(t.s[t.i]=='[')i++;
            }
            return;
        }
        if(c==']'&&t.i!=0){
            int i=1;
            while(i>0){
                t.i--;
                if(t.s[t.i]==']')i++;
                if(t.s[t.i]=='[')i--;
            }
            return ;
        }
        t.i++;
    }
    static char[]n(char[]a){
        String b="<^>+-[]";
        for(int i=a.length-1;i>=0;i--){
            int j=b.indexOf(a[i]);
            if(j<6){a[i]=b.charAt(j+1);return a;}
            a[i]='<';
        }
        char[]c=Arrays.copyOf(a,a.length+1);
        c[a.length]='<';
        return c;
    }
    public static void main(String[]a){
        List<PROGRAM>programs=new ArrayList<PROGRAM>();
        char[]c={};
        while(true){
            PROGRAM t=new PROGRAM();
            t.s=c;
            if(isBalanced(c))programs.add(t);
            c=n(c);
            for(PROGRAM u:programs){
                try{step(u);if(u.h){programs.remove(u);System.out.println(String.valueOf(u.s));break ;}}catch(Exception e){
                    programs.remove(u);break ;
                }
            }
        }
    }
    static boolean isBalanced(char[]c) {
        int i=0;
        for(char d:c){
            if(d=='[')i++;
            if(d==']')i--;
            if(i<0)return false;
        }
        return i==0;
    }
}

那究竟问题出在哪里呢?我似乎无法找到它,但是,基于输出,它显然在某处。

编辑:我能够自己找到问题。我现在应该怎么处理这个问题?

0 个答案:

没有答案