Sunday, December 29, 2013

Javacc code generation
































Hi everyone. I am developing a mini language for my school, but I am stuck. How can I convert my syntax into the syntax of C language and then compile it with gcc and execute it. I am under linux mint. I am using javacc
















































Java Code:





































options
{
JDK_VERSION = "1.5";
static = true;
/*debug_parser = true;*/
}

PARSER_BEGIN(EG0)
import java.util.*;
import java.util.*;
import java.io.*;

public class EG0
{
private static List<Identificador> identificadores = new ArrayList<Identificador>();
private static Token tipo1 = null, tipo2 = null, tipo3 = null, tipo4 = null;

public static void main(String args[])throws ParseException
{

try
{
EG0 parser = new EG0(new FileInputStream("/home/mustafa/Escritorio/JavaCC/EG0/programa.musta"));

parser.tokentizer();

for(Identificador i: identificadores)
{
System.out.println(i.getNombre());
System.out.println(i.getTipo());
System.out.println(i.getValor());
}

}

catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
PARSER_END(EG0)

/*Secuencias de espace*/
SKIP:
{
" " |
"\r" |
"\t" |
"\n"
}

/*Operadores aritmeticos*/
TOKEN:
{
<SUMA: "+"> |
<RESTA: "-"> |
<MULTIPLICAR: "*"> |
<DIVIDIR: "/"> |
<RECIDUO: "%"> |
<IGUAL: "=">
}

/*Operadores relacionales*/
TOKEN:
{
<MAYOR: ">"> |
<MENOR: "<"> |
<MAYORIGUAL: ">="> |
<MENORIGUAL: "<="> |
<IGUALIGUAL: "==">
}

/*Operadores logicos*/
TOKEN:
{
<AND: "&&"> |
<OR: "!!"> |
<NOT: "!=">
}

/*Palabras reservadas del lenguaje*/
TOKEN:
{
<INICIO: "=)"> |
<FIN: "=("> |
<ENTERO: "intx"> |
<REAL: "floatx"> |
<CADENA: "stringx"> |
<IF: "ifx"> |
<ELSE: "elsex"> |
<FOR: "forx"> |
<WHILE: "whilex"> |
<SWITCH: "switchx"> |
<CASE: "casex"> |
<BREAK: "breakx"> |
<INPUT: "inputx"> |
<OUTPUT: "outputx">
}

/*Valores numericos, caracteres e identificadores*/
TOKEN:
{
<VALOR_ENTERO: (<digitos>)+> |
<VALOR_REAL: (<digitos>)+"."(<digitos>)+> |
<VALOR_CADENA: ("\""(~["\""])+"\"")> |
<IDENTIFICADOR: (<letras>) (<letras> | <digitos>)*> |
<#digitos: ["0"-"9"]> |
<#letras: ["a"-"z", "A"-"Z"]>
}

/*Lexemas simples*/
TOKEN:
{
<LPAREN: "("> | <RPAREN: ")"> | <SEMICOLON: ";"> | <INCREMENTO: "++"> | <PUNTOPUNTO: ":">
}

/*Analizador lexico*/
public void tokentizer():
{}
{
<INICIO>
{
System.out.println("#include <stdio.h>");
System.out.println("#include <stdlib.h>");
System.out.println("");
System.out.println("int main()");
System.out.println("{");
}

(intX() | floatX() | stringX() | outputX())

<FIN>
{
System.out.println("return 0;");
System.out.println("}");
}
}

/*Tipo de dato int*/
public void intX():
{
Token tipo;
Token nombre;
Token valores;
Identificador id;
}
{
(tipo = <ENTERO>) (nombre = <IDENTIFICADOR>) <IGUAL> (valores = valores()) <SEMICOLON>

{
id = new Identificador();
id.setTipo(tipo.image);
id.setNombre(nombre.image);
id.setValor(valores.image);
}

/*Analisis semantico*/
{
if(valores == tipo1)
{
/*Generacion de codigo*/
if(id.getTipo().equals("intx"))
System.out.print("int " + id.getNombre());

if(valores != null)
System.out.print(" = " + id.getValor());

System.out.println(";");

}

if(valores == tipo2)
System.out.println("El valor " + tipo2 + " es semanticamente incorrecto");

if(valores == tipo3)
System.out.println("El valor " + tipo3 + " es semanticamente incorrecto");

if(valores == tipo4)
System.out.println("El identificador " + tipo4 + " es semanticamente incorrecto");
}
}

/*Tipo de dato float*/
public void floatX():
{
Token tipo;
Token nombre;
Token valores;
Identificador id;
}
{
(tipo = <REAL>) (nombre = <IDENTIFICADOR>) <IGUAL> (valores = valores()) <SEMICOLON>

{
id = new Identificador();
id.setTipo(tipo.image);
id.setNombre(nombre.image);
id.setValor(valores.image);
}

/*Analisis semantico*/
{
if (valores == tipo1)
System.out.println("El valor " + tipo1 + " es semanticamente incorrecto");

if(valores == tipo2)
{
/*Generacion de codigo*/
if(id.getTipo().equals("floatx"))
System.out.print("double " + id.getNombre());

if(valores != null)
System.out.print(" = " + id.getValor());

System.out.println(";");

}

if(valores == tipo3)
System.out.println("El valor " + tipo3 + " es semanticamente incorrecto");

if(valores == tipo4)
System.out.println("El identificador " + tipo4 + " es semanticamente incorrecto");
}
}

/*Tipo de dato string*/
public void stringX():
{
Token tipo;
Token nombre;
Token valores;
Identificador id;
}
{
(tipo = <CADENA>) (nombre = <IDENTIFICADOR>) <IGUAL> (valores = valores()) <SEMICOLON>
{
id = new Identificador();
id.setTipo(tipo.image);
id.setNombre(nombre.image);
id.setValor(valores.image);

/*Analisis semantico*/
if (valores == tipo1)
System.out.println("El valor " + tipo1 + " es semanticamente incorrecto");

if(valores == tipo2)
System.out.println("El valor " + tipo2 + " es semanticamente incorrecto");

if(valores == tipo3)
{
/*Generacion de codigo*/
if(id.getTipo().equals("stringx"))
System.out.print("char " + id.getNombre() + "[255]");

if(valores != null)
System.out.print(" = " + id.getValor());

System.out.println(";");

}

if(valores == tipo4)
System.out.println("El identificador " + tipo4 + " es semanticamente incorrecto");
}
}

/*Valores, caracteres e identificadores*/
public Token valores():
{}
{
(tipo1 = <VALOR_ENTERO> | tipo2 = <VALOR_REAL> | tipo3 = <VALOR_CADENA> | tipo4 = <IDENTIFICADOR>)

{
if(tipo1 != null)
return tipo1;

if(tipo2 != null)
return tipo2;

if(tipo3 != null)
return tipo3;

if(tipo4 != null)
return tipo4;
}
}

/*Funciones de entrada y salida*/
public void outputX():
{
Token letra;
}
{
<OUTPUT> (letra = <VALOR_CADENA>) <SEMICOLON>
{
System.out.println("printf(" + letra + ");");
}
}



































this is my programa.musta















































Java Code:





































=)
outputx "Hola Mundo!";
=(


































































No comments:

Post a Comment