Interpretador C em Java não funciona

Estou tentando criar uma lógica pra interpretar o codigo C simples e não consigo, e descidi mostrar aqui o codigo junto com o erro que ta dando ultimamente.

Este código ta poluído e eu to quebrando a cabeça pra fazer um interpretador C feito em Java,quem tem interesse me ajuda aí! :slight_smile:

package cbs;
import java.util.*;
public class Main {
 boolean IMPORT_STDIO_H=false;
 String DIR_PROJECT="/storage/emulated/0/cbs/projects/";
 String FILE_MAIN="main.cpp";//nao use barra no inicio
 String YOUR_PROJECT=DIR_PROJECT+FILE_MAIN;
 String url=YOUR_PROJECT;
 String data=""+Arquivo.read(url);//Esta classe Arquivo e só pra ler o arquivo principal e retornar o texto
 String FILE_NOW=YOUR_PROJECT;
 String instruction="";
 int LENGTH_INSTRUCTION=1;
 boolean SINGLE_QUOTE_EXPECTED=false;
 boolean DOUBLE_QUOTE_EXPECTED=false;
 int ultima_posicao=0;
 public Main(){
  MainThread mt=new MainThread();
  mt.run();
 }
 class MainThread extends Thread{
  public void run(){
   System.out.printf("codigo fonte:\n%s\n",data);
   System.out.printf("Execução:\n");
   interp();
   interpretarC();
  }
 }
 public void interp(){
  String str="printf";
  int i=0;
  ArrayList<String> chars=new ArrayList<String>();
  boolean b1=false;
  boolean b2=false;
  boolean b3=false;
  boolean b4=false;
  boolean b5=false;
  boolean b6=false;
  do{
   if(chars.size()==0){
    chars.add(str.charAt(i)+"");
    b1=true;
   }else{
    if(b1){
     chars.add(chars.get(0)+str.charAt(i+1)+"");
    }
    b2=true;
    if(b2){
     chars.add(chars.get(1)+str.charAt(i+2)+"");
    }
    b3=true;
    if(b3){
     chars.add(chars.get(2)+str.charAt(i+3)+"");
    }
    b4=true;
    if(b4){
     chars.add(chars.get(3)+str.charAt(i+4)+"");
    }
    b5=true;
    if(b5){
     chars.add(chars.get(4)+str.charAt(i+5)+"");
    }
    b6=true;
    if(b6){
     chars.add(chars.get(5)+str.charAt(i+6)+"");
    }
   }
   i=i+1;
  }while(i<str.length());
 }
 public void interpretarC(){
  if(data.length()>0){
   int i=0;
   do{
    instruction=instruction+data.charAt(i);
    if(instruction==" " && instruction=="\n"){
     instruction="";
    }
    if(data.length()-i >= 6){
     String instruction2=instruction;
     instruction=data.charAt(i-5)+data.charAt(i-4)+data.charAt(i-3)+data.charAt(i-2)+data.charAt(i-1)+data.charAt(i)+"";
    if(instruction=="printf"){
     int i2=i+1;
     instruction=data.charAt(i2)+"";
     boolean PARENTS_ABERTO=false;
     do{
      if(instruction==";"){
       System.exit(0);
      }else if(instruction=="("){
       PARENTS_ABERTO=true;
      }else if(instruction==")"){
       
      }else{
       if(PARENTS_ABERTO){
        System.out.print(instruction);
       }
      }
      i2=i2+1;
     }while(i2<data.length());
    }
     instruction=instruction2;
    }
    i=i+1;
   }while(i<data.length());
   instruction="";
  }else{
   //erro Arquivo vazio
  }
 }
 public void interpretarC2(){
  if(data.length()>0){
   int i=0;
   do{
    
    System.out.println("achou:"+data.charAt(i));
    if(instruction.equals(";") && SINGLE_QUOTE_EXPECTED == false && DOUBLE_QUOTE_EXPECTED == false){
     ultima_posicao=i;
     Arquivo.write("/storage/emulated/0/cbs/bin/variavel"+LENGTH_INSTRUCTION+".txt",ultima_posicao+"\n"+FILE_NOW);
    }
    if(data.charAt(i)+""=="\'"){
     if(SINGLE_QUOTE_EXPECTED != false && i>0){
      if(data.charAt(i-1)+"" != "\\"){
       SINGLE_QUOTE_EXPECTED=true;
      }else{
       SINGLE_QUOTE_EXPECTED=false;
      }
     }else{
      SINGLE_QUOTE_EXPECTED=true;
     }
    }else if(data.charAt(i)+""=="\""){
     if(DOUBLE_QUOTE_EXPECTED != false && i>0){
      if(data.charAt(i-1)+"" != "\\"){
       DOUBLE_QUOTE_EXPECTED=true;
      }else{
       DOUBLE_QUOTE_EXPECTED=false;
      }
     }else{
      DOUBLE_QUOTE_EXPECTED=true;
     }
    }else if(data.charAt(i)+""=="\n"){
     //nada
    }else if(data.charAt(i)+""=="//"){
    instruction="";
    int i2=i+1;
    do{
     if(instruction.equals("\n")){
      System.out.printf("barra n");
      instruction="";
      i=i2;
      break;
     }else{
      instruction="";
     }
     i2=i2+1;
    }while(i2<data.length());
   }
   
   
   if(data.charAt(i)+""==";"){/* Se o Fim de Uma Instrução foi encontrado */
 //le o codigo json anterior de um arquivo '.json'
 //armazena esta ultima instrução em json
 //escreve o codigo json atualizado em um arquivo '.json'
}else if(data.charAt(i)+""=="("){/* Se o início de uma sequencia de parametros for espectado */
 //procura o nome da função
}else if(data.charAt(i)+""==")"){/* Se o fim de uma sequencia de parametros for espectado */

}else if(data.charAt(i)+""=="["){/* Se o início de um indice de vértice for espectado */

}else if(data.charAt(i)+""=="]"){/* Se o fim de um indice de vértice for espectado */

}else if(data.charAt(i)+""=="{"){/* Se um bloco de código foi espectado */

}else if(data.charAt(i)+""=="}"){/* Se achou o fim do bloco de código espectado */

}
   
   if(instruction.equals("/   *")){
    instruction="";
    int i2=i+1;
    do{
     if(instruction.equals("*  /")){
      instruction="";
      i=i2;
      break;
     }else if(instruction.equals("*")){
      instruction="*";
     }else{
      instruction="";
     }
     i2=i2+1;
    }while(i2<data.length());
   }
   
   if(instruction.equals("#include")){
    System.out.printf("#include");
    instruction="";
    boolean I_DOIS_BREAK=false;
    int i2=i+1;
    do{
     instruction=instruction+data.charAt(i2);
     if(instruction.equals(" ")){
      instruction="";
     }
     if(instruction.equals("<")){
      int i3=i2+1;
      do{
       System.out.println(instruction);
       if(" "==data.charAt(i3)+""){
        //Ignora 
       }else{
        instruction=instruction+data.charAt(i3);
       }
       if(instruction.equals("<stdio.h>")){
        IMPORT_STDIO_H=true;
        System.out.println("import ;import true"+instruction);
        instruction=">";
       }
       if(instruction.equals("<stdlib.h>")){
        instruction=">";
       }
       if(instruction.equals(">")){
        instruction="";
        I_DOIS_BREAK=true;
        i2=i3;
        break;
       }
       i3=i3+1;
      }while(i3<data.length());
     }
     if(I_DOIS_BREAK){
      i=i2;
      break;
     }else{
      i2=i2+1;
     }
    }while(i2<data.length());
   }
    i=i+1;
   }while(i<data.length());
  }
 }
 
 public static void main(String[] args) {
  Main m=new Main();
 }
}

Abaixo esta o erro:

java.lang.StringIndexOutOfBoundsException: length=6; index=6
	at java.lang.String.indexAndLength(String.java:500)
	at java.lang.String.charAt(String.java:494)
	at cbs.Main.interp(Main.java:60)
	at cbs.Main$MainThread.run(Main.java:24)
	at cbs.Main.<init>(Main.java:18)
	at cbs.Main.main(Main.java:243)
	at java.lang.reflect.Method.invoke(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:372)
	at com.duy.android.compiler.java.Java.run(Java.java:115)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.executeDex(ExecuteActivity.java:147)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.exec(ExecuteActivity.java:124)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.access$100(ExecuteActivity.java:45)
	at com.duy.ide.javaide.run.activities.ExecuteActivity$1.run(ExecuteActivity.java:88)
	at java.lang.Thread.run(Thread.java:818)

Se alguém poder me Ajudar com um simples codigo em Java pra interpretar C, escreva aí ,pra ajudar a mim e a outros que sofrem com isso!

Todas as suas comparações de String utilizando == não vão funcionar.

1 curtida

Verdade obrigado!

Já ouviu falar em analise léxica, analise sintática ou analise semântica?

2 curtidas

Já, valeu por me relembrar, vou ver melhor sobre isso!