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í!
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!