Skip to content

Instantly share code, notes, and snippets.

@diego14c
Last active August 29, 2015 14:15
Show Gist options
  • Save diego14c/b1f547a9f1ef9428eaa2 to your computer and use it in GitHub Desktop.
Save diego14c/b1f547a9f1ef9428eaa2 to your computer and use it in GitHub Desktop.
Compilador inversor de cadenas
/* --------------------------Codigo de Usuario----------------------- */
package compilador; //Paquete en donde se creará el analizador
/*Importamos la librería de CUP y todas las clases del paquete runtime*/
import java_cup.runtime.*;
%% //INICIO DE OPCIONES
/* ------ Seccion de opciones y declaraciones de JFlex -------------- */
/*
Cambiamos el nombre de la clase del analizador a Lexer
*/
%class AnalizadorLexico
%line //Activar el contador de lineas, variable yyline
%column //Activar el contador de columna, variable yycolumn
%cup //Activamos la compatibilidad con Java CUP para analizadores sintacticos
/*
Declaraciones
El codigo entre %{ y %} será copiado íntegramente en el
analizador generado.
*/
%{
/*Necesaria para poder controlar el error del ;*/
boolean estadoFinLinea = false;
/* Generamos un java_cup.Symbol para guardar el tipo de token
encontrado */
private Symbol symbol(int type) {
return new Symbol(type, yyline, yycolumn);
}
/* Generamos un Symbol para el tipo de token encontrado
junto con su valor */
private Symbol symbol(int type, Object value) {
return new Symbol(type, yyline, yycolumn, value);
}
%}
/*
Macro declaraciones
Declaramos expresiones regulares que despues usaremos en las
reglas léxicas.
*/
/*Todos los caracteres excepto los que se muestran en el alfabeto*/
Letras_Numeros = [^\;\-\>\(\)]*
%% //FIN DE OPCIONES
/* -------------------- Seccion de reglas lexicas ------------------ */
/*
Esta seccion contiene expresiones regulares y acciones.
Las acciones son código en Java que se ejecutarán cuando se
encuentre una entrada válida para la expresión regular correspondiente */
/* YYINITIAL es el estado inicial del analizador lexico al escanear.
Las expresiones regulares solo serán comparadas si se encuentra
en ese estado inicial. Es decir, cada vez que se encuentra una
coincidencia el scanner vuelve al estado inicial. Por lo cual se ignoran
estados intermedios.*/
<YYINITIAL> {
/* Retorna que el token FIN_LINEA declarado en la clase sym, fue encontrado. */
";" { estadoFinLinea = true;
return symbol(sym.FIN_LINEA); }
/* Retorna que el token INVERTIDA_ES declarado en la clase sym, fue encontrado. */
"->" { System.out.print("->");
return symbol(sym.INVERTIDA_ES); }
/* Retorna que el token PARENTESIS_INICIO declarado en la clase sym, fue encontrado. */
"(" { System.out.print("(");
return symbol(sym.PARENTESIS_INICIO); }
/* Retorna que el token PARENTESIS_FINAL declarado en la clase sym, fue encontrado. */
")" { System.out.println(")");
return symbol(sym.PARENTESIS_FINAL); }
/* Retorna que el token PALABRA_RESERVADA declarado en la clase sym, fue encontrado. */
"INVERTIR" { System.out.println("#-#-#-#-#-#-#-#-#-# SENTENCIA #-#-#-#-#-#-#-#-#-#");
System.out.print(yytext());
return symbol(sym.PALABRA_RESERVADA); }
/* Cuando encuentra un String se imprime, se retorna el token CADENA que
representa la cadena a invertir con el valor que se obtuvo de yytext().
yytext() es el token encontrado. */
{Letras_Numeros} {
/*Método para controlar cuando no existe el fin de línea,
es decir cuando no se pone el ; al fin de la sentencia.*/
if (!estadoFinLinea && yytext().isEmpty()) {
/*En caso de que no se encuentre el ; me devuelve
null para imprimir el error, esto en el analizador
sintáctico*/
return null;
} else {
/*Es caso de que no haya problema con el ;*/
System.out.print(yytext());
return symbol(sym.CADENA, yytext());
}
}
}
/* Si el token contenido en la entrada no coincide con ninguna regla entonces
se marca un token ilegal */
[^] { throw new Error("El caracter <"+yytext()+"> es ilegal"); }
/* The following code was generated by JFlex 1.5.0-SNAPSHOT */
/* --------------------------Codigo de Usuario----------------------- */
package compilador; //Paquete en donde se creará el analizador
/*Importamos la librería de CUP y todas las clases del paquete runtime*/
import java_cup.runtime.*;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.5.0-SNAPSHOT
* from the specification file <tt>alexico.flex</tt>
*/
class AnalizadorLexico implements java_cup.runtime.Scanner {
/** This character denotes the end of file */
public static final int YYEOF = -1;
/** initial size of the lookahead buffer */
private static final int ZZ_BUFFERSIZE = 16384;
/** lexical states */
public static final int YYINITIAL = 0;
/**
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
* at the beginning of a line
* l is of the form l = 2*k, k a non negative integer
*/
private static final int ZZ_LEXSTATE[] = {
0, 0
};
/**
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
"\50\0\1\5\1\1\3\0\1\3\15\0\1\2\2\0\1\4\6\0"+
"\1\11\3\0\1\6\4\0\1\7\3\0\1\12\1\0\1\13\1\0"+
"\1\10\uffa9\0";
/**
* Translates characters to character classes
*/
private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
/**
* Translates DFA states to action switch labels.
*/
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
"\2\1\1\2\1\3\2\4\1\5\1\1\1\6\6\1"+
"\1\7";
private static int [] zzUnpackAction() {
int [] result = new int[16];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAction(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/**
* Translates a state to a row index in the transition table
*/
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 =
"\0\0\0\14\0\30\0\30\0\44\0\30\0\30\0\60"+
"\0\30\0\74\0\110\0\124\0\140\0\154\0\170\0\14";
private static int [] zzUnpackRowMap() {
int [] result = new int[16];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
}
private static int zzUnpackRowMap(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int high = packed.charAt(i++) << 16;
result[j++] = high | packed.charAt(i++);
}
return j;
}
/**
* The transition table of the DFA
*/
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
"\1\2\1\3\1\4\1\5\1\6\1\7\1\10\6\2"+
"\5\0\6\2\20\0\1\11\7\0\1\2\5\0\1\2"+
"\1\12\5\2\5\0\2\2\1\13\4\2\5\0\3\2"+
"\1\14\3\2\5\0\4\2\1\15\2\2\5\0\5\2"+
"\1\16\1\2\5\0\1\17\6\2\5\0\4\2\1\20"+
"\1\2";
private static int [] zzUnpackTrans() {
int [] result = new int[132];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
}
private static int zzUnpackTrans(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
value--;
do result[j++] = value; while (--count > 0);
}
return j;
}
/* error codes */
private static final int ZZ_UNKNOWN_ERROR = 0;
private static final int ZZ_NO_MATCH = 1;
private static final int ZZ_PUSHBACK_2BIG = 2;
/* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
/**
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
*/
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\2\1\2\11\1\1\2\11\1\1\1\11\7\1";
private static int [] zzUnpackAttribute() {
int [] result = new int[16];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAttribute(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/** the input device */
private java.io.Reader zzReader;
/** the current state of the DFA */
private int zzState;
/** the current lexical state */
private int zzLexicalState = YYINITIAL;
/** this buffer contains the current text to be matched and is
the source of the yytext() string */
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
/** the textposition at the last accepting state */
private int zzMarkedPos;
/** the current text position in the buffer */
private int zzCurrentPos;
/** startRead marks the beginning of the yytext() string in the buffer */
private int zzStartRead;
/** endRead marks the last character in the buffer, that has been read
from input */
private int zzEndRead;
/** number of newlines encountered up to the start of the matched text */
private int yyline;
/** the number of characters up to the start of the matched text */
private int yychar;
/**
* the number of characters from the last newline up to the start of the
* matched text
*/
private int yycolumn;
/**
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
*/
private boolean zzAtBOL = true;
/** zzAtEOF == true <=> the scanner is at the EOF */
private boolean zzAtEOF;
/** denotes if the user-EOF-code has already been executed */
private boolean zzEOFDone;
/* user code: */
/*Necesaria para poder controlar el error del ;*/
boolean estadoFinLinea = false;
/* Generamos un java_cup.Symbol para guardar el tipo de token
encontrado */
private Symbol symbol(int type) {
return new Symbol(type, yyline, yycolumn);
}
/* Generamos un Symbol para el tipo de token encontrado
junto con su valor */
private Symbol symbol(int type, Object value) {
return new Symbol(type, yyline, yycolumn, value);
}
/**
* Creates a new scanner
* There is also a java.io.InputStream version of this constructor.
*
* @param in the java.io.Reader to read input from.
*/
AnalizadorLexico(java.io.Reader in) {
this.zzReader = in;
}
/**
* Creates a new scanner.
* There is also java.io.Reader version of this constructor.
*
* @param in the java.io.Inputstream to read input from.
*/
AnalizadorLexico(java.io.InputStream in) {
this(new java.io.InputStreamReader
(in, java.nio.charset.Charset.forName("UTF-8")));
}
/**
* Unpacks the compressed character translation table.
*
* @param packed the packed character translation table
* @return the unpacked character translation table
*/
private static char [] zzUnpackCMap(String packed) {
char [] map = new char[0x10000];
int i = 0; /* index in packed string */
int j = 0; /* index in unpacked array */
while (i < 44) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do map[j++] = value; while (--count > 0);
}
return map;
}
/**
* Refills the input buffer.
*
* @return <code>false</code>, iff there was new input.
*
* @exception java.io.IOException if any I/O-Error occurs
*/
private boolean zzRefill() throws java.io.IOException {
/* first: make room (if you can) */
if (zzStartRead > 0) {
System.arraycopy(zzBuffer, zzStartRead,
zzBuffer, 0,
zzEndRead-zzStartRead);
/* translate stored positions */
zzEndRead-= zzStartRead;
zzCurrentPos-= zzStartRead;
zzMarkedPos-= zzStartRead;
zzStartRead = 0;
}
/* is the buffer big enough? */
if (zzCurrentPos >= zzBuffer.length) {
/* if not: blow it up */
char newBuffer[] = new char[zzCurrentPos*2];
System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
zzBuffer = newBuffer;
}
/* finally: fill the buffer with new input */
int numRead = zzReader.read(zzBuffer, zzEndRead,
zzBuffer.length-zzEndRead);
if (numRead > 0) {
zzEndRead+= numRead;
return false;
}
// unlikely but not impossible: read 0 characters, but not at end of stream
if (numRead == 0) {
int c = zzReader.read();
if (c == -1) {
return true;
} else {
zzBuffer[zzEndRead++] = (char) c;
return false;
}
}
// numRead < 0
return true;
}
/**
* Closes the input stream.
*/
public final void yyclose() throws java.io.IOException {
zzAtEOF = true; /* indicate end of file */
zzEndRead = zzStartRead; /* invalidate buffer */
if (zzReader != null)
zzReader.close();
}
/**
* Resets the scanner to read from a new input stream.
* Does not close the old reader.
*
* All internal variables are reset, the old input stream
* <b>cannot</b> be reused (internal buffer is discarded and lost).
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
*
* Internal scan buffer is resized down to its initial length, if it has grown.
*
* @param reader the new input stream
*/
public final void yyreset(java.io.Reader reader) {
zzReader = reader;
zzAtBOL = true;
zzAtEOF = false;
zzEOFDone = false;
zzEndRead = zzStartRead = 0;
zzCurrentPos = zzMarkedPos = 0;
yyline = yychar = yycolumn = 0;
zzLexicalState = YYINITIAL;
if (zzBuffer.length > ZZ_BUFFERSIZE)
zzBuffer = new char[ZZ_BUFFERSIZE];
}
/**
* Returns the current lexical state.
*/
public final int yystate() {
return zzLexicalState;
}
/**
* Enters a new lexical state
*
* @param newState the new lexical state
*/
public final void yybegin(int newState) {
zzLexicalState = newState;
}
/**
* Returns the text matched by the current regular expression.
*/
public final String yytext() {
return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
}
/**
* Returns the character at position <tt>pos</tt> from the
* matched text.
*
* It is equivalent to yytext().charAt(pos), but faster
*
* @param pos the position of the character to fetch.
* A value from 0 to yylength()-1.
*
* @return the character at position pos
*/
public final char yycharat(int pos) {
return zzBuffer[zzStartRead+pos];
}
/**
* Returns the length of the matched text region.
*/
public final int yylength() {
return zzMarkedPos-zzStartRead;
}
/**
* Reports an error that occured while scanning.
*
* In a wellformed scanner (no or only correct usage of
* yypushback(int) and a match-all fallback rule) this method
* will only be called with things that "Can't Possibly Happen".
* If this method is called, something is seriously wrong
* (e.g. a JFlex bug producing a faulty scanner etc.).
*
* Usual syntax/scanner level error handling should be done
* in error fallback rules.
*
* @param errorCode the code of the errormessage to display
*/
private void zzScanError(int errorCode) {
String message;
try {
message = ZZ_ERROR_MSG[errorCode];
}
catch (ArrayIndexOutOfBoundsException e) {
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
}
throw new Error(message);
}
/**
* Pushes the specified amount of characters back into the input stream.
*
* They will be read again by then next call of the scanning method
*
* @param number the number of characters to be read again.
* This number must not be greater than yylength()!
*/
public void yypushback(int number) {
if ( number > yylength() )
zzScanError(ZZ_PUSHBACK_2BIG);
zzMarkedPos -= number;
}
/**
* Contains user EOF-code, which will be executed exactly once,
* when the end of file is reached
*/
private void zzDoEOF() throws java.io.IOException {
if (!zzEOFDone) {
zzEOFDone = true;
yyclose();
}
}
/**
* Resumes scanning until the next regular expression is matched,
* the end of input is encountered or an I/O-Error occurs.
*
* @return the next token
* @exception java.io.IOException if any I/O-Error occurs
*/
public java_cup.runtime.Symbol next_token() throws java.io.IOException {
int zzInput;
int zzAction;
// cached fields:
int zzCurrentPosL;
int zzMarkedPosL;
int zzEndReadL = zzEndRead;
char [] zzBufferL = zzBuffer;
char [] zzCMapL = ZZ_CMAP;
int [] zzTransL = ZZ_TRANS;
int [] zzRowMapL = ZZ_ROWMAP;
int [] zzAttrL = ZZ_ATTRIBUTE;
while (true) {
zzMarkedPosL = zzMarkedPos;
boolean zzR = false;
for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;
zzCurrentPosL++) {
switch (zzBufferL[zzCurrentPosL]) {
case '\u000B':
case '\u000C':
case '\u0085':
case '\u2028':
case '\u2029':
yyline++;
yycolumn = 0;
zzR = false;
break;
case '\r':
yyline++;
yycolumn = 0;
zzR = true;
break;
case '\n':
if (zzR)
zzR = false;
else {
yyline++;
yycolumn = 0;
}
break;
default:
zzR = false;
yycolumn++;
}
}
if (zzR) {
// peek one character ahead if it is \n (if we have counted one line too much)
boolean zzPeek;
if (zzMarkedPosL < zzEndReadL)
zzPeek = zzBufferL[zzMarkedPosL] == '\n';
else if (zzAtEOF)
zzPeek = false;
else {
boolean eof = zzRefill();
zzEndReadL = zzEndRead;
zzMarkedPosL = zzMarkedPos;
zzBufferL = zzBuffer;
if (eof)
zzPeek = false;
else
zzPeek = zzBufferL[zzMarkedPosL] == '\n';
}
if (zzPeek) yyline--;
}
zzAction = -1;
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
zzState = ZZ_LEXSTATE[zzLexicalState];
// set up zzAction for empty match case:
int zzAttributes = zzAttrL[zzState];
if ( (zzAttributes & 1) == 1 ) {
zzAction = zzState;
}
zzForAction: {
while (true) {
if (zzCurrentPosL < zzEndReadL)
zzInput = zzBufferL[zzCurrentPosL++];
else if (zzAtEOF) {
zzInput = YYEOF;
break zzForAction;
}
else {
// store back cached positions
zzCurrentPos = zzCurrentPosL;
zzMarkedPos = zzMarkedPosL;
boolean eof = zzRefill();
// get translated positions and possibly new buffer
zzCurrentPosL = zzCurrentPos;
zzMarkedPosL = zzMarkedPos;
zzBufferL = zzBuffer;
zzEndReadL = zzEndRead;
if (eof) {
zzInput = YYEOF;
break zzForAction;
}
else {
zzInput = zzBufferL[zzCurrentPosL++];
}
}
int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
if (zzNext == -1) break zzForAction;
zzState = zzNext;
zzAttributes = zzAttrL[zzState];
if ( (zzAttributes & 1) == 1 ) {
zzAction = zzState;
zzMarkedPosL = zzCurrentPosL;
if ( (zzAttributes & 8) == 8 ) break zzForAction;
}
}
}
// store back cached position
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
case 1:
{ /*Método para controlar cuando no existe el fin de línea,
es decir cuando no se pone el ; al fin de la sentencia.*/
if (!estadoFinLinea && yytext().isEmpty()) {
/*En caso de que no se encuentre el ; me devuelve
null para imprimir el error, esto en el analizador
sintáctico*/
return null;
} else {
/*Es caso de que no haya problema con el ;*/
System.out.print(yytext());
return symbol(sym.CADENA, yytext());
}
}
case 8: break;
case 2:
{ System.out.println(")");
return symbol(sym.PARENTESIS_FINAL);
}
case 9: break;
case 3:
{ estadoFinLinea = true;
return symbol(sym.FIN_LINEA);
}
case 10: break;
case 4:
{ throw new Error("El caracter <"+yytext()+"> es ilegal");
}
case 11: break;
case 5:
{ System.out.print("(");
return symbol(sym.PARENTESIS_INICIO);
}
case 12: break;
case 6:
{ System.out.print("->");
return symbol(sym.INVERTIDA_ES);
}
case 13: break;
case 7:
{ System.out.println("#-#-#-#-#-#-#-#-#-# SENTENCIA #-#-#-#-#-#-#-#-#-#");
System.out.print(yytext());
return symbol(sym.PALABRA_RESERVADA);
}
case 14: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
zzDoEOF();
{ return new java_cup.runtime.Symbol(sym.EOF); }
}
else {
zzScanError(ZZ_NO_MATCH);
}
}
}
}
}
//----------------------------------------------------
// The following code was generated by CUP v0.11a beta 20060608
// Fri Feb 13 04:57:27 COT 2015
//----------------------------------------------------
package compilador;
import java.io.FileReader;
/** CUP v0.11a beta 20060608 generated parser.
* @version Fri Feb 13 04:57:27 COT 2015
*/
public class AnalizadorSintactico extends java_cup.runtime.lr_parser {
/** Default constructor. */
public AnalizadorSintactico() {super();}
/** Constructor which sets the default scanner. */
public AnalizadorSintactico(java_cup.runtime.Scanner s) {super(s);}
/** Constructor which sets the default scanner. */
public AnalizadorSintactico(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);}
/** Production table. */
protected static final short _production_table[][] =
unpackFromStrings(new String[] {
"\000\005\000\002\002\004\000\002\005\002\000\002\002" +
"\005\000\002\003\004\000\002\004\005" });
/** Access to production table. */
public short[][] production_table() {return _production_table;}
/** Parse-action table. */
protected static final short[][] _action_table =
unpackFromStrings(new String[] {
"\000\013\000\004\004\004\001\002\000\004\005\013\001" +
"\002\000\004\002\011\001\002\000\004\007\000\001\002" +
"\000\004\007\010\001\002\000\004\002\uffff\001\002\000" +
"\004\002\001\001\002\000\004\007\ufffe\001\002\000\004" +
"\011\014\001\002\000\004\006\015\001\002\000\004\007" +
"\ufffd\001\002" });
/** Access to parse-action table. */
public short[][] action_table() {return _action_table;}
/** <code>reduce_goto</code> table. */
protected static final short[][] _reduce_table =
unpackFromStrings(new String[] {
"\000\013\000\006\002\004\003\005\001\001\000\004\004" +
"\011\001\001\000\002\001\001\000\004\005\006\001\001" +
"\000\002\001\001\000\002\001\001\000\002\001\001\000" +
"\002\001\001\000\002\001\001\000\002\001\001\000\002" +
"\001\001" });
/** Access to <code>reduce_goto</code> table. */
public short[][] reduce_table() {return _reduce_table;}
/** Instance of action encapsulation class. */
protected CUP$AnalizadorSintactico$actions action_obj;
/** Action encapsulation object initializer. */
protected void init_actions()
{
action_obj = new CUP$AnalizadorSintactico$actions(this);
}
/** Invoke a user supplied parse action. */
public java_cup.runtime.Symbol do_action(
int act_num,
java_cup.runtime.lr_parser parser,
java.util.Stack stack,
int top)
throws java.lang.Exception
{
/* call code in generated class */
return action_obj.CUP$AnalizadorSintactico$do_action(act_num, parser, stack, top);
}
/** Indicates start state. */
public int start_state() {return 0;}
/** Indicates start production. */
public int start_production() {return 0;}
/** <code>EOF</code> Symbol index. */
public int EOF_sym() {return 0;}
/** <code>error</code> Symbol index. */
public int error_sym() {return 1;}
/* Reporte de los errores encontrados. */
public void report_error(String message, Object info) {
StringBuilder m = new StringBuilder("Error");
int linea = 0;
int columna = 0;
/*Control para el error de "lectura de la última línea de la sentencia"*/
if ("".equals((((java_cup.runtime.Symbol) info).value)) && (((java_cup.runtime.Symbol) info).sym) == 7) {
System.out.print("");
} else {
if (info instanceof java_cup.runtime.Symbol) {
java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);
//Determinamos la línea y columna del error
if (s.left >= 0) {
linea = s.left + 1;
if (s.right >= 0) {
columna = s.right + 1;
}
}
}
//Linea y Columna ya tiene un valor asignado para perzonalizar los errores
m.append(" en la línea ").append(linea);
m.append(", columna ").append(columna);
if (columna == 0) {//Error en caso de no ingresar el ;
m.append(" : ").append(message).append(" : No se ha terminado la sentencia con ;\n"
+ "\tSugerencia: La sentencia debe terminar --> INVERTIR(cadena a invertir);");
}
if (columna == 1) {//Error en caso de ingresar mal la palabra reservada INVERTIR
m.append(" : ").append(message).append(" : No se reconoce la palabra reservada\n"
+ "\tSugerencia: La sentencia debe empezar con la palabra resevada --> INVERTIR");
}
if (columna == 10) {//Error en caso de ingresar sentencia correcta y cadena vacía
m.append(" : ").append(message).append(" : INVETIR('') Cadena vacía\n"
+ "\tSugerencia: Debe ingresar algún valor en la sentencia --> INVERTIR(cadena a invertir)");
}
if (columna > 10) {//Error en caso de no ingresar el último paréntesis
m.append(" : ").append(message).append(" : No se reconoce la cadena ingresada\n"
+ "\tSugerencia: La cadena debe ir entre paréntesis --> (cadena a invertir)");
}
System.err.println(m);//Imprimimos el error y la sugerencia
}
}
/* Cuando se encuentra un error de donde el sistema no puede
recuperarse, se lanza un error fatal. Se despliega el mensaje
de error y la sugerencia determinada en el método. */
public void report_fatal_error(String message, Object info) {
report_error(message, info);
}
/* Metodo main para garantizar la ejecucion del analizador
lexico y sintactico, ademas que se pase como parametro la tabla
de simbolos correspondiente. */
public static void main(String[] args){
try {
AnalizadorSintactico asin = new AnalizadorSintactico(
new AnalizadorLexico(new FileReader(args[0])));
Object result = asin.parse().value;//Ejecución del Analizador
} catch (Exception ex) {
System.out.print("");
}
}
/*Método necesario para realizar el objetivo principal del
compilador, que en este caso es de invertir una cadena*/
public String invertirCadena(String cadena) {
String cadenaInversa = "";
int posicionInicial = 0;
for (int i = 0; i < cadena.length(); i++) {
if (String.valueOf(cadena.charAt(i)).equals(" ")) {//En caso de los espacios
cadenaInversa = " ".concat(cadena.substring(posicionInicial, i))
.concat(cadenaInversa);
posicionInicial = i + 1;//Guarda la posición inicial del substring
}
if (i == cadena.length() - 1) {//En caso de la última subcadena
cadenaInversa = cadena.substring(posicionInicial, i + 1).concat(cadenaInversa);
}
}
return cadenaInversa;//Retornamos la cadena ya invertida
}
}
/** Cup generated class to encapsulate user supplied action code.*/
class CUP$AnalizadorSintactico$actions {
private final AnalizadorSintactico parser;
/** Constructor */
CUP$AnalizadorSintactico$actions(AnalizadorSintactico parser) {
this.parser = parser;
}
/** Method with the actual generated action code. */
public final java_cup.runtime.Symbol CUP$AnalizadorSintactico$do_action(
int CUP$AnalizadorSintactico$act_num,
java_cup.runtime.lr_parser CUP$AnalizadorSintactico$parser,
java.util.Stack CUP$AnalizadorSintactico$stack,
int CUP$AnalizadorSintactico$top)
throws java.lang.Exception
{
/* Symbol object for return from actions */
java_cup.runtime.Symbol CUP$AnalizadorSintactico$result;
/* select the action based on the action number */
switch (CUP$AnalizadorSintactico$act_num)
{
/*. . . . . . . . . . . . . . . . . . . .*/
case 4: // cadena ::= PARENTESIS_INICIO CADENA PARENTESIS_FINAL
{
String RESULT =null;
int aleft = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).left;
int aright = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).right;
String a = (String)((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).value;
RESULT = a;
CUP$AnalizadorSintactico$result = parser.getSymbolFactory().newSymbol("cadena",2, ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-2)), ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), RESULT);
}
return CUP$AnalizadorSintactico$result;
/*. . . . . . . . . . . . . . . . . . . .*/
case 3: // linea ::= PALABRA_RESERVADA cadena
{
Object RESULT =null;
int cleft = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()).left;
int cright = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()).right;
String c = (String)((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.peek()).value;
/*Aquí llamamos al método que invierte las cadenas y almacenamos su
resultado en RESULT*/
RESULT = new AnalizadorSintactico().invertirCadena(c);
CUP$AnalizadorSintactico$result = parser.getSymbolFactory().newSymbol("linea",1, ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)), ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), RESULT);
}
return CUP$AnalizadorSintactico$result;
/*. . . . . . . . . . . . . . . . . . . .*/
case 2: // expr ::= linea NT$0 FIN_LINEA
{
Object RESULT =null;
// propagate RESULT from NT$0
RESULT = (Object) ((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).value;
int lleft = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-2)).left;
int lright = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-2)).right;
Object l = (Object)((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-2)).value;
CUP$AnalizadorSintactico$result = parser.getSymbolFactory().newSymbol("expr",0, ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-2)), ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), RESULT);
}
return CUP$AnalizadorSintactico$result;
/*. . . . . . . . . . . . . . . . . . . .*/
case 1: // NT$0 ::=
{
Object RESULT =null;
int lleft = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()).left;
int lright = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()).right;
Object l = (Object)((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.peek()).value;
//Obtenemos la producción de linea e imprimimos nuestra cadena invertida
System.out.println("#-#-#-#-#-#-#-#-#-# INVERTIDA ES "
+ "#-#-#-#-#-#-#-#-#-#\n -> " + l);
CUP$AnalizadorSintactico$result = parser.getSymbolFactory().newSymbol("NT$0",3, ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), RESULT);
}
return CUP$AnalizadorSintactico$result;
/*. . . . . . . . . . . . . . . . . . . .*/
case 0: // $START ::= expr EOF
{
Object RESULT =null;
int start_valleft = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).left;
int start_valright = ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).right;
Object start_val = (Object)((java_cup.runtime.Symbol) CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)).value;
RESULT = start_val;
CUP$AnalizadorSintactico$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.elementAt(CUP$AnalizadorSintactico$top-1)), ((java_cup.runtime.Symbol)CUP$AnalizadorSintactico$stack.peek()), RESULT);
}
/* ACCEPT */
CUP$AnalizadorSintactico$parser.done_parsing();
return CUP$AnalizadorSintactico$result;
/* . . . . . .*/
default:
throw new Exception(
"Invalid action number found in internal parse table");
}
}
}
/* ---------------Seccion de declaraciones preliminares--------------------*/
package compilador; //Paquete en donde se creará el analizador
/*Importamos la clase FileReader del paquete java.io para poder leer el
archivo test.txt en cual se almacenan las sentecias ingresadas*/
import java.io.FileReader;
/* Código del parser, se copia íntegramente a la clase final.
Agregamos el manejo de errores. */
parser code {:
/* Reporte de los errores encontrados. */
public void report_fatal_error(String message, Object info) {
StringBuilder m = new StringBuilder("Error");
int linea = 0;
int columna = 0;
/*Control para el error de "lectura de la última línea de la sentencia"*/
if ("".equals((((java_cup.runtime.Symbol) info).value))
&& (((java_cup.runtime.Symbol) info).sym) == 7) {
System.out.print("");
} else {
if (info instanceof java_cup.runtime.Symbol) {
java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);
//Determinamos la línea y columna del error
if (s.left >= 0) {
linea = s.left + 1;
if (s.right >= 0) {
columna = s.right + 1;
}
}
}
//Linea y Columna ya tiene un valor asignado para perzonalizar los errores
m.append(" en la línea ").append(linea);
m.append(", columna ").append(columna);
if (columna == 0) {//Error en caso de no ingresar el ;
m.append(" : ").append(message).append(" : No se ha terminado la sentencia con ;\n"
+ "\tSugerencia: La sentencia debe terminar
--> INVERTIR(cadena a invertir);");
}
if (columna == 1) {//Error en caso de ingresar mal la palabra reservada INVERTIR
m.append(" : ").append(message).append(" : No se reconoce la palabra reservada\n"
+ "\tSugerencia: La sentencia debe empezar con la palabra resevada
--> INVERTIR");
}
if (columna == 10) {//Error en caso de ingresar sentencia correcta y cadena vacía
m.append(" : ").append(message).append(" : INVETIR('') Cadena vacía\n"
+ "\tSugerencia: Debe ingresar algún valor en la sentencia
--> INVERTIR(cadena a invertir)");
}
if (columna > 10) {//Error en caso de no ingresar el último paréntesis
m.append(" : ").append(message).append(" : No se reconoce la cadena ingresada\n"
+ "\tSugerencia: La cadena debe ir entre paréntesis
--> (cadena a invertir)");
}
System.err.println(m);//Imprimimos el error y la sugerencia
}
}
/* Cuando se encuentra un error de donde el sistema no puede
recuperarse, se lanza un error fatal. Se despliega el mensaje
de error y la sugerencia determinada en el método. */
public void report_fatal_error(String message, Object info) {
report_error(message, info);
}
/* Metodo main para garantizar la ejecucion del analizador
lexico y sintactico, ademas que se pase como parametro la tabla
de simbolos correspondiente. */
public static void main(String[] args){
try {
AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico(new FileReader(args[0])));
Object result = asin.parse().value;//Ejecución del Analizador
} catch (Exception ex) {
System.out.print("");
}
}
/*Método necesario para realizar el objetivo principal del
compilador, que en este caso es de invertir una cadena*/
public String invertirCadena(String cadena) {
String cadenaInversa = "";
int posicionInicial = 0;
for (int i = 0; i < cadena.length(); i++) {
if (String.valueOf(cadena.charAt(i)).equals(" ")) {//En caso de los espacios
cadenaInversa = " ".concat(cadena.substring(posicionInicial, i)).concat(cadenaInversa);
posicionInicial = i + 1;//Guarda la posición inicial del substring
}
if (i == cadena.length() - 1) {//En caso de la última subcadena
cadenaInversa = cadena.substring(posicionInicial, i + 1).concat(cadenaInversa);
}
}
return cadenaInversa;//Retornamos la cadena ya invertida
}
:};
/* ------------Declaracion de simbolos terminales y no terminales---------- */
/* Terminales (tokens obtenidos por el analizador lexico).
Las variables terminales serán todos los símbolos terminales de la gramática*/
terminal PALABRA_RESERVADA, PARENTESIS_INICIO, PARENTESIS_FINAL, FIN_LINEA, INVERTIDA_ES;
terminal String CADENA;
/* Las variables no terminales serán todas las variables que representaran
producciones*/
non terminal Object expr, linea;
non terminal String cadena;
/* -------------Seccion de predencia y asociacion de los terminales----------- */
/* Esta sección es opcional. En nuestro compilador no vamos a utilizar esta sección,
se lo puede hacer, de ser necesario.*/
/* ------------------- Seccion de la gramatica ------------------------ */
// En este sección se escriben las producciones de la misma
start with expr;//Este compilador inciara la producción desde el no-terminal expr
/*Para que la sentencia una vez realzadas las anteriores producciones, termine en ;
INVERTIR(cadena que vamos a invertir);*/
expr ::= linea:l
{:
//Obtenemos la producción de linea e imprimimos nuestra cadena invertida
System.out.println("#-#-#-#-#-#-#-#-#-# INVERTIDA ES #-#-#-#-#-#-#-#-#-#\n -> " + l);
:}
FIN_LINEA
;
/*Ya con la cadena entre paréntesis, nos aseguramos que antes de esta simpre
vaya la palabra reservada
INVERTIR(cadena que vamos a invertir)*/
linea ::= PALABRA_RESERVADA cadena:c
{:
/*Aquí llamamos al método que invierte las cadenas y almacenamos su
resultado en RESULT*/
RESULT = new AnalizadorSintactico().invertirCadena(c);
:}
;
/*Nos aseguramos que nuesta cadena siempre vaya entre paréntesis
(cadena que vamos a invertir) */
cadena ::= PARENTESIS_INICIO CADENA:a PARENTESIS_FINAL
{:
RESULT = a;
:}
;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package compilador;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
/**
* @author diego
*/
public class Ejecutor {
public final static int EJECUTAR = 1;
public final static int AVANZADO = 2;
public final static int GENERAR = 1;
public final static int ATRAS = 2;
public final static int SALIR = 3;
/**
* Es un menu para elegir entre generar el analizador lexico y sintactico, o
* ejecutarlos sobre un archivo de pruebas.
*
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("\t\t\t### ##### ##### #### #### ####\n"
+ "\t\t\t## ## # ##__ ## ___ ## ## #\n"
+ "\t\t\t## ## # ## ## ## ## ## #\n"
+ "\t\t\t### ##### ##### #### #### #### O\n");
menuPrincipal(args);
}
public static void menuPrincipal(String[] args) {
Scanner in = new Scanner(System.in);
int valor;
System.out.println("\t********************=={INVERSOR DE CADENAS}==********************\n"
+ "\t\t\t----|||| MENU PRINCIPAL ||||----\n"
+ "1) Ejecutar compilador\n".toUpperCase()
+ "2) Ir a OPCIONES AVANZADAS\n"
+ "3) Salir del compilador\n"
+ "Elija una opcion:");
System.out.print("# ");
valor = in.nextInt();
switch (valor) {
case EJECUTAR: {
System.out.println("Ingrese la sentencia:");
System.out.print("> ");
Scanner lector = new Scanner(System.in);
String sentencia = lector.nextLine();
if (!sentencia.isEmpty()) {
try {
try (FileWriter fichero = new FileWriter("test.txt")) {
PrintWriter pw = new PrintWriter(fichero);
pw.print(sentencia);
}
} catch (Exception e) {
System.err.print(e);
}
} else {
System.out.println("Por favor, Ingrese una sentencia..");
break;
}
String[] archivoPrueba = {"test.txt"};
AnalizadorSintactico.main(archivoPrueba);
System.out.println("Ejecutado!");
break;
}
case AVANZADO: {
menuAvanzado(args);
break;
}
case SALIR: {
System.out.println("Chao!");
break;
}
default: {
System.out.println("Opcion no valida!");
break;
}
}
}
public static void menuAvanzado(String[] args) {
System.out.println("\t\t\t----|||| MENU OPCIONES AVANZADAS ||||----\n"
+ "1) Generar archivos Jflex y Cup\n".toUpperCase()
+ "2) Volver al MENU PRINCIPAL\n"
+ "3) Salir del compilador\n"
+ "Elija una opcion:");
System.out.print("# ");
Scanner in = new Scanner(System.in);
int valor = in.nextInt();
switch (valor) {
case GENERAR: {
System.out.println("\n*** Generando ***\n");
String archLexico;
String archSintactico;
if (args.length > 0) {
archLexico = args[0];
archSintactico = args[1];
} else {
archLexico = "alexico.flex";
archSintactico = "asintactico.cup";
}
String[] alexico = {archLexico};
String[] asintactico = {"-parser", "AnalizadorSintactico", archSintactico};
jflex.Main.main(alexico);
try {
java_cup.Main.main(asintactico);
} catch (Exception ex) {
Logger.getLogger(Ejecutor.class.getName()).log(Level.SEVERE, null, ex);
}
//movemos los archivos generados
boolean mvAL = moverArchivos("AnalizadorLexico.java");
boolean mvAS = moverArchivos("AnalizadorSintactico.java");
boolean mvSym = moverArchivos("sym.java");
if (mvAL && mvAS && mvSym) {
System.exit(0);
}
System.out.println("Generado!");
break;
}
case ATRAS: {
menuPrincipal(args);
break;
}
case SALIR: {
System.out.println("Chao!");
break;
}
default:
System.out.println("Opcion no valida!");
break;
}
}
public static boolean moverArchivos(String archNombre) {
boolean efectuado = false;
File arch = new File(archNombre);
if (arch.exists()) {
System.out.println("\n*** Moviendo " + arch + " \n***");
Path currentRelativePath = Paths.get("");
String nuevoDir = currentRelativePath.toAbsolutePath().toString()
+ File.separator + "src" + File.separator
+ "compilador" + File.separator + arch.getName();
File archViejo = new File(nuevoDir);
archViejo.delete();
if (arch.renameTo(new File(nuevoDir))) {
System.out.println("\n*** Generado " + archNombre + "***\n");
efectuado = true;
} else {
System.out.println("\n*** No movido " + archNombre + " ***\n");
}
} else {
System.out.println("\n*** Codigo no existente ***\n");
}
return efectuado;
}
}
//----------------------------------------------------
// The following code was generated by CUP v0.11a beta 20060608
// Fri Feb 13 04:57:27 COT 2015
//----------------------------------------------------
package compilador;
/** CUP generated class containing symbol constants. */
public class sym {
/* terminals */
public static final int INVERTIDA_ES = 6;
public static final int PARENTESIS_FINAL = 4;
public static final int error = 1;
public static final int FIN_LINEA = 5;
public static final int PALABRA_RESERVADA = 2;
public static final int PARENTESIS_INICIO = 3;
public static final int EOF = 0;
public static final int CADENA = 7;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment