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