animaciÓn traductor ddt con cup. en esta animación se puede ver el árbol generado del traductor...

Post on 02-Apr-2015

120 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

ANIMACIÓN

Traductor DDT con CUP

En esta animación se puede ver el árbol generado del traductor ascendente mediante transparencias realizadas en PowerPoint. Previamente realizado a mano.

En cada paso (derivación/reducción), se ha especificado la producción aplicada en el caso de la construcción del árbol.

Posteriormente se ha construido la evolución que sigue el traductor CUP para evaluar el resultado de la expresión.

El caso de prueba a analizar es: (false and (74 >= 34)) xor 45 < 78 ;

Este es el que aparece en el enunciado de la práctica, y el resultado es el siguiente:

A

Partiendo desde el axioma construiremos el árbol correspondiente:

A := L

L := L xor J

J := C

C := numero opmenor numero

L := J

J := apertura_parentesis L cierre_parentesis

L := L and J

J := apertura_parentesis L cierre_parentesis

L := J

J := C

C := numero opmayori numero

L := J

J := vfalse

J:=vfalse {:Simbolo s=new Simbolo(); s.valor=false;RESULT = s;

:}

Ahora que hemos construido el árbol sintáctico, se procede a evaluarlo de manera ascendente:

L::=J:eval {:Simbolo s=new Simbolo(); s.valor=eval.valor; RESULT = s;

:}

C::=numero:n1 opmayori numero:n2 {:int v1=Integer.parseInt(n1); int v2=Integer.parseInt(n2); Simbolo s=new Simbolo(); s.valor=(v1 >= v2); RESULT = s;

:}

J::=C:eval {:Simbolo s=new Simbolo(); s.valor=eval.valor; RESULT = s;

:}

L::=J:eval {:Simbolo s=new Simbolo(); s.valor=eval.valor; RESULT = s;

:}

J::=apertura_parentesis L:eval cierre_parentesis {:Simbolo s=new Simbolo(); s.valor=(eval.valor); RESULT = s;

:}

L::=L:ev1 opand J:ev2 {:Simbolo s=new Simbolo(); s.valor=(ev1.valor && ev2.valor); RESULT = s;

:}

J::=apertura_parentesis L:eval cierre_parentesis {:Simbolo s=new Simbolo(); s.valor=(eval.valor); RESULT = s;

:}

L::=J:eval {:Simbolo s=new Simbolo(); s.valor=eval.valor;RESULT = s;

:}

C::=numero:n1 opmenor numero:n2 {:int v1=Integer.parseInt(n1); int v2=Integer.parseInt(n2); Simbolo s=new Simbolo(); s.valor=(v1 < v2); RESULT = s;

:}

J::=C:eval {:Simbolo s=new Simbolo(); s.valor=eval.valor; RESULT = s;

:}

L::=L:ev1 opxor J:ev2 {:Simbolo s=new Simbolo(); s.valor=(ev1.valor ^ ev2.valor); RESULT = s;

:}

A::=L:eval semicolon {: System.out.println("\n\nExpresion logica correcta. Valor final: "+ eval.valor +"\n\n"); :};

El resultado que imprime por pantalla es:

APERTURA_PAR [(]FALSE [false] OPAND [and] APERTURA_PAR [(]NUMERO [74] OPMAYORI [>=] NUMERO [34]CIERRE_PAR [)]CIERRE_PAR [)] OPXOR [xor] NUMERO [45] OPMENOR [<] NUMERO [78] SEMICOLON [;] NUMERO [345]

Expresion logica correcta. Valor final: true

top related