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;
}
}
那究竟问题出在哪里呢?我似乎无法找到它,但是,基于输出,它显然在某处。
编辑:我能够自己找到问题。我现在应该怎么处理这个问题?