280 likes | 438 Views
Traductor DDS en CUP. Expresiones lógicas. Clase Simbolo. La clase Simbolo de java permite almacenar el valor asociado a una determinada producción. Para este traductor es suficiente con definirla de la siguiente manera:. public class Simbolo { boolean valor;
E N D
Traductor DDS en CUP Expresiones lógicas
Clase Simbolo • La clase Simbolo de java permite almacenar el valor asociado a una determinada producción. • Para este traductor es suficiente con definirla de la siguiente manera: public class Simbolo { boolean valor; public Simbolo(boolean valor) { this.valor = valor; } }
Gramática en CUP terminal Stringsemicolon, apertura_parentesis, cierre_parentesis, opand, opor, opnand, opnor, opxor, opxnor, opnot, opigual, opdist, opmenor, opmayor, opmenori, opmayori, vtrue, vfalse, numero; non terminal Simbolo A, L, J, C; startwith A; A ::= L:eval semicolon {: System.out.println("Valor final:" + eval.valor + "\n\n"); :} A | L:eval semicolon {: System.out.println("Valor final:" + eval.valor + "\n\n"); :} ; L ::= L:e1 opand J:e2 {: RESULT = newSimbolo(e1.valor && e2.valor); :} | L:e1 opor J:e2 {: RESULT = newSimbolo(e1.valor || e2.valor); :}
Gramática en CUP | L:e1 opnand J:e2 {: RESULT = new Simbolo(!(e1.valor && e2.valor)); :} | L:e1 opnor J:e2 {: RESULT = new Simbolo(!(e1.valor || e2.valor)); :} | L:e1 opxor J:e2 {: RESULT = new Simbolo(e1.valor ^ e2.valor); :} | L:e1 opxnor J:e2 {: RESULT = new Simbolo(!(e1.valor ^ e2.valor)); :} | J:eval {: RESULT = new Simbolo(eval.valor); :} ; J ::= apertura_parentesis L:eval cierre_parentesis {: RESULT = new Simbolo(eval.valor); :}
Gramática en CUP | vtrue {: RESULT = new Simbolo(true); :} | vfalse {: RESULT = new Simbolo(false); :} | opnotapertura_parentesis L:eval cierre_parentesis {: RESULT = new Simbolo(!eval.valor); :} | C:eval {: RESULT = new Simbolo(eval.valor); :} ; C ::= numero:n1 opigual numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) == Integer.parseInt(n2)); :} | numero:n1 opdist numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) != Integer.parseInt(n2)); :}
Gramática en CUP | numero:n1 opmenor numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) < Integer.parseInt(n2)); :} | numero:n1 opmayor numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) > Integer.parseInt(n2)); :} | numero:n1 opmenori numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) <= Integer.parseInt(n2)); :} | numero:n1 opmayori numero:n2 {: RESULT = new Simbolo(Integer.parseInt(n1) >= Integer.parseInt(n2)); :} ;
Proceso de traducción • En la animación siguiente se muestra el proceso de traducción que sigue la expresión lógica:(false and (74 >= 34)); • En cada fotograma se muestra el árbol sintáctico en un determinado estado del traductor. • En rojo aparece la producción que se está analizando y en verde las acciones semánticas relacionadas.
Proceso de traducción • Primera producción “a”, reconoce la(s) expresión(es) que terminan en “;”. • Cadena involucrada en la producción (false and (74 >= 34)); a
Proceso de traducción • Siguiente producción “l”, analiza y procesa la expresión completa • Cadena involucrada en la producción (false and (74 >= 34)); l a ;
Proceso de traducción • Siguiente producción “j”, analiza y procesa elementos terminales, expresiones dentro de paréntesis y comparaciones de números. • Cadena involucrada en la producción (false and (74 >= 34)); l j a ;
Proceso de traducción • Siguiente producción “l”, analiza y procesa la expresión completa • Cadena involucrada en la producción (false and (74 >= 34)); ( l j l a ; )
Proceso de traducción • Siguiente producción “l”, analiza y procesa la expresión completa • Cadena involucrada en la producción (false and (74 >= 34)); ( l l j l and a ; ) j
Proceso de traducción • Siguiente producción “j”, analiza y procesa elementos terminales, expresiones dentro de paréntesis y comparaciones de números. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j l j l and a ; ) j
Proceso de traducción false • Elemento terminal “false”, se devuelve un nuevo símbolo con el valor lógico del elemento terminal. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and a ; ) j
Proceso de traducción false • “j” devuelve el correspondiente símbolo con el valor de la expresión calculada. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and a ; ) j
Proceso de traducción • Siguiente producción “j”, analiza y procesa elementos terminales, expresiones dentro de paréntesis y comparaciones de números. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and a ; ) j
Proceso de traducción • Siguiente producción “l”, analiza y procesa la expresión completa • Cadena involucrada en la producción (falseand (74 >= 34)); ( l j false l j l and ( a ; ) j l )
Proceso de traducción • Siguiente producción “j”, analiza y procesa elementos terminales, expresiones dentro de paréntesis y comparaciones de números. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( a ; ) j l j )
Proceso de traducción • Siguiente producción “c”, analiza y procesa comparaciones de números. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( a ; ) j l j c )
Proceso de traducción • Elementos terminales “74 >= 34”, se devuelve un nuevo símbolo con el valor lógico del resultado de la operación lógica. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a ; ) j l j c >= ) 34 true
Proceso de traducción • “c” devuelve el correspondiente símbolo con el valor de la expresión calculada. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a ; ) j l j c >= true ) 34
Proceso de traducción • “j” devuelve el correspondiente símbolo con el valor de la expresión calculada. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a ; ) j l j c >= true ) 34
Proceso de traducción • “l” devuelve el correspondiente símbolo con el valor de la expresión calculada. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a ; ) j l j c >= true ) 34
Proceso de traducción • “j” devuelve el correspondiente símbolo con el valor de la expresión calculada (false and true). • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a ; ) j l j c >= false (false and true) ) 34
Proceso de traducción • “l” devuelve el correspondiente símbolo con el valor de la expresión calculada (false and true). • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a false ; ) j l j c >= ) 34
Proceso de traducción • “j” devuelve el correspondiente símbolo con el valor de la expresión calculada (false and true). • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false l j l and ( 74 a false ; ) j l j c >= ) 34
Proceso de traducción • “l” devuelve el correspondiente símbolo con el valor de la expresión calculada (false and true). • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false false l j l and ( 74 a ; ) j l j c >= ) 34
Proceso de traducción • Finalmente “a” recibe el valor de la expresión lógica calculada en la producción “l” y se muestra por pantalla. • Cadena involucrada en la producción (false and (74 >= 34)); ( l j false Resultado= false l j l and ( 74 a ; ) j l j c >= ) 34