style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Crear un compilador en java

Buenas noches quisiera que me orientaran para hacer un compilador en java que me value si es correcta o no esta sintaxis:
import java.io.*;
osea esta libreria si me puedieran orientar se los agradeceria ya que tengo que entregarlo a mas tardar el martes de esta semana .

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Mira esta respuesta

Mira esta respuesta anterior:

http://www.javamexico.org/blogs/gelo1002/compilador

Ahí vienen ligas a otras respuestas sobre este mismo tema.

Revisalas.

Imagen de Carlossuazo

Soy nuevo en Programacion

La Teoria ya la tengo pero soy malo en la logica para esto porque me resultan muchas dudas como validar los espacios en blanco, los caracteres puntos y comas, nose quisiera ver un codigo fuente para esto porque si me resulta dificil :s

Postea lo que llevas y en que

Postea lo que llevas y en que necesitas ayuda y quizá así sea mucho más fácil ayudarte.

Imagen de neko069

No creo que le sirva de mucho

No creo que le sirva de mucho la ayuda @Oscar... lo tenía que entregar HOY! HOY! HOY! .....

Lo que se me ocurre es que

Lo que se me ocurre es que tomes el código de algún compilador open source y obtengas la parte que hace eso.

Por ejemplo, esté es el fuente del JDK

http://hg.openjdk.java.net/

: - )

Imagen de Carlossuazo

Bueno ya avanze

Si ya pude hacer algo pero ahora el maestro me pidio una validacion mas que nose como hacerla quiere que dentro de mi copilador que lo que hace es evaluarme System.out.print("Hola Mundo"); y me dija si es valida o no.
Ahora lo que quiere que haga me q valide System.out.print("Hola Mundo" + c); ahora con una variable.

Imagen de Carlossuazo

Este es mi codigo del compilador

import java.io.*;
import java.util.Scanner;

public class compilador
{
                static String cadena;
            static String cadena2;
                static String [] divides;
                static String [] divides2;
                static String [] divides3;
       
               
                static boolean b;
                static boolean a;
                static boolean c;
                static boolean d;
                static boolean e;
                static boolean f;
                static boolean g;
                static boolean h;
       
               
                static int a2;
                static int puntosycomas=0;;
               
       
        public void sintaxis()throws IOException
        {
       
               
                Scanner leer=new Scanner(System.in);
               
                    System.out.println("\nValua si es correcto o incorrecto un: System.out.print(''Hola Mundo'');");   
                        System.out.println("Introduce tu cadena a validar:");
                        cadena = leer.nextLine();
                        char []dividecaracteres=cadena.toCharArray();
                        divides=cadena.split("\\.");
                        divides2=cadena.split("\\(");
                        cadena2=divides2[0];
                        divides3=cadena2.split("\\.");
                 
               
/////////////////////////////////////////////////////////////////////////////////////////////                  
         for(int i=0;i<divides.length;i++){
                if(i==0){
                         if(divides[0].equals("System")){
                                a=true;
                        }
                }              
                if(i==1){
                        if(divides[1].equals("out")){
                                b=true;
                         }
                 }     
           }
/////////////////////////////////////////////////////////////////////////////////////////////////      
         if(divides.length==0){
                }else
                        for(int p=0;p<divides3.length;p++){
                        if(p==2){
                                if(divides3[p].equals("print")){
                                        c=true;
                                }
                    }
                }
         
////////////////////////////////////////////////////////////////////////////////////////////////                       
         for(int l=0;l<dividecaracteres.length;l++){
                if(l==16){
                 if(dividecaracteres[16]=='('){
                                d=true;
                        }
                }
                if(l==17){
                        if(dividecaracteres[17]=='"'){
                                e=true;
                        }
                }
         }
               
       
//////////////////////////////////////////////////////////////////////////////////////
        for(int j=0;j<dividecaracteres.length;j++){
                                if(dividecaracteres[j]==')'){
                                        a2 = j;
                                        f=true;
                                }
                        }
///////////////////////////////////////////////////////////////////////////////////////
    int comillas=0;
    int comilla2=a2-1;
        for(int w=0;w<dividecaracteres.length;w++){
                        if(dividecaracteres[w]=='"'){
                                comillas++;
                        }
                }
       
        if(comillas>=3){
                                g=false;
                                e=false;
                }
                        else{
                             for(int u=0;u<dividecaracteres.length;u++){
                                        if(u==comilla2){
                                                if(dividecaracteres[u]=='"'){
                                                        g=true;
                                                 }
                                        }
                             }
                }      
                       
/////////////////////////////////////////////////////////////////////////////////////////
    int puntocoma=a2+1;        
        int lol=puntocoma+1;
       
    if(dividecaracteres.length!=lol){
    h=false;   
        }
        else{
                for(int z=0;z<dividecaracteres.length;z++){
                           if(z==puntocoma){   
                                if(dividecaracteres[z]==';'){
                                        h=true;
                                }
                           }
                          }
                        }      
                       

/////////////////////////////////////////////////////////////////////////////////////////////////
        if(a==true&&b==true&&c==true&&d==true&&e==true&&f==true&&g==true&&h==true){
                                System.out.println("\nSintaxis Correcta");
                        }else{
                                System.out.println("\nSintaxis Incorrecta");
                }
               

        }
       
}

Imagen de Carlossuazo

Codigo

No se porque no me aparece todo el codigo x.x

Imagen de Algus Dark

Quizá...

Quizá puedas poner el código entre los tags de "code" o subirlo a pastebin (http://pastebin.com/)
Quizá sea que para un comentario son muchas letras.

Saludos!

Ya arreglé el código,

Ya arreglé el código, recuerda ponerlo entre los tags <code>

Bueno, difícilmente se podría llamar a lo que tienes un "compilador" , aunque sinceramente la definición de "compilador" es bastante amplia.

En todo caso eso se parece mucho más al parseador / tokenizer del compilador.

Volviendo a tu pregunta, deberías de primero ( esto es lo tradicional ) separar la entrada por tokens ( cosas, partes, elementos como le quieras llamar ) donde cada token es de cierto tipo. Y luego aplicar una regla a la secuencia de tokens para ver si es válida o no.

Entonces, tus reglas deberían de ser que debes de separar por todos los signos:  . (  )  + " ; y cualquier cosa que este entre ellos es un token distinto.

Entonces la entrada:

System.out.print("Hola Mundo");

Tendría los tokens:

tokens = [ System, . ,  out, . ,  print, (,  "Hola Mundo", )  ]

Y la entrada:

System.out.print("Hola Mundo" + c);

Tendrá los tokens:

tokens = [ System, .,  out, .,  print, (,  "Hola Mundo", +,  c ,  ; ) ]

Porque "Hola Mundo" y c están separados por un "+" correcto?

Luego que tengas esta cadena, este flujo, lo que tienes que hacer es aplicar una regla para ver si tiene sentido. Por ejemplo en Java lo siguiente tiene tokens válidos pero la sintáxis no es válida:

System.( . print + out ) ; "Hola"

Los tokens serían:

tokens = [ System, .,  ( , print, +,  out, ) , ; ,  "Hola" ]

Que en esencia son los mismos tokens, pero en diferente orden. Lo que hay que hacer ahí es decir que después de un punto no puede ir un parentesis o que después de un punto y coma no puede ir una cadena.

En fin eso es la base, como hacerlo varía mucho pero primero tienes que tener claro que vas a hacer.

Leete los post que puse anterioremente y vuelve a preguntar más.

Saludos.

Imagen de Carlossuazo

Duda

No me quedo muy claro lo ultimo @Oscar si me pudieras dar algo mas detallado o algun ejemplo mas especifico para hacerlo , algun codigo fuente porfas :/

Claro. Da click

Claro.

Da click aquí y sigue los links hasta que encuentres el código fuente

http://www.javamexico.org/foros/javamexico_20/crear_un_compilador_en_jav...

Imagen de Carlossuazo

¿?

Sigo en las mismas bueno gracias aver que pasa

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">