Post on 13-Jan-2016
description
Expresiones lógicas
Clase Simbolo
public class Simbolo{
boolean valor;public Simbolo(boolean valor){
this.valor = valor;}
}
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:
Gramática en CUPterminal String semicolon, 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;start with 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 = new Simbolo(e1.valor && e2.valor);
:}| L:e1 opor J:e2 {:
RESULT = new Simbolo(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);:}| opnot apertura_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));
:};
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
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
a
l
;
Siguiente producción “l”, analiza y procesa la expresión completa
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j
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));
Proceso de traducción
a
l
;
j l
)
(
Siguiente producción “l”, analiza y procesa la expresión completa
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j l
)
(
Siguiente producción “l”, analiza y procesa la expresión completa
Cadena involucrada en la producción (false and (74 >= 34));
and
j
l
Proceso de traducción
a
l
;
j l
)
(
and
j
l j
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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
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));
false
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
Siguiente producción “l”, analiza y procesa la expresión completa
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j
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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j
Siguiente producción “c”, analiza y procesa comparaciones de números.
Cadena involucrada en la producción (false and (74 >= 34));
c
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
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));
true
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
true
“c” devuelve el correspondiente símbolo con el valor de la expresión calculada.
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
true
“j” devuelve el correspondiente símbolo con el valor de la expresión calculada.
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
true
“l” devuelve el correspondiente símbolo con el valor de la expresión calculada.
Cadena involucrada en la producción (false and (74 >= 34));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
false(false and true)
“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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
false
“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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
false
“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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
false
“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));
Proceso de traducción
a
l
;
j l
)
(
and
j
l jfalse
l
)
(
j c >=
34
74
Resultado=false
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));