EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1...

26
EDT con ANTLR a e ; e 1 t ) e ( f Entrada: (1+5)*5; 1 a t 1 t 1 f OPMULT numer o t e 1 f t 1 numer o e 1 t OPSUMA f t 1 numer o 5 5 1 En esta diapositiva se muestra el árbol generado por la cadena de entrada. A continuación se explica detalladamente cada paso seguido por el Esquema De Traducción con ANTLR.

Transcript of EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1...

Page 1: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

1

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

En esta diapositiva se muestra el árbol generado por la cadena de entrada.

A continuación se explica detalladamente cada paso seguido por el Esquema De Traducción con ANTLR.

Page 2: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

2

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “1”).

f returns [String ret=""]: … |num=NUMERO {$ret=$num.text;} ;

Page 3: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

3

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor de tipo cadena que llega de “f” se convierte a tipo entero y se pasa como atributo heredado a “t1”.

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 4: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

4

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor que recibe “t1” como atributo heredado es devuelto como atributo sintetizado, ya que en este caso es una producción lambda y no se realizan otras acciones semánticas.

t1 [int n1] returns [int resul=0;] : …| {$resul=$n1;};

Page 5: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

5

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor calculado como atributo sintetizado es propagado también por la producción “t”.

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 6: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

6

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

Ese valor recibido de “t” (se recuerda que es un entero igual a 1) es pasado como atributo heredado a “e1”, para realizar las operaciones necesarias.

e returns [int resul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;};

Page 7: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

7

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

En este punto “e1” cuenta con el valor (1) que recibe en forma de atributo heredado de “e”, pero antes de operar se necesita el otro operando, de forma que se calcula.

Page 8: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

8

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “5”).

f returns [String ret=""]: … |num=NUMERO {$ret=$num.text;} ;

Page 9: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

9

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor de tipo cadena que llega de “f” se convierte a tipo entero y se pasa como atributo heredado a “t1”.

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 10: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

10

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor que recibe “t1” como atributo heredado es devuelto como atributo sintetizado, ya que en este caso es una producción lambda y no se realizan otras acciones semánticas.

t1 [int n1] returns [int resul=0;] : …| {$resul=$n1;};

Page 11: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

11

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

El valor calculado como atributo sintetizado es propagado también por la producción “t” hacia “e1”.

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 12: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

12

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

En este punto la producción “e1” tiene el primer valor entero (1), el operador suma, el segundo valor (5) y pasa a “e1” como atributo heredado el resultado de la operación (1+5=6).

e1 [int n1] returns [int resul=0] : OPSUMA num2=t num=e1[$n1+$num2.resul] {$resul=$num.resul;}

Page 13: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

13

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e1” es una producción lambda, por lo tanto lo único que hace es devolver como atributo sintetizado el atributo heredado que recibió.

e1 [int n1] returns [int resul=0] : … | {$resul=$n1;};

Page 14: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

14

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e1” sigue propagando el valor sintetizado (6).

e1 [int n1] returns [int resul=0] : OPSUMA num2=t num=e1[$n1+$num2.resul] {$resul=$num.resul;}

Page 15: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

15

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e” propaga el valor del atributo sintetizado hacia “f”.

e returns [int resul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;};

Page 16: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

16

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“f” propaga el valor del atributo sintetizado hacia “t”, pero como vimos antes, “f” propaga un valor de tipo cadena y recibe un entero, de manera que debe convertirlo.f returns [String ret=""]: | '(' exp=e ')' {$ret=Integer.toString($exp.resul);}

Page 17: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

17

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“t” convierte a entero el valor del atributo sintetizado que recibe de “f” y lo pasa como atributo heredado a “t1”(6).

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 18: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

18

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “5”) y la propaga hacia “t1”.

f returns [String ret=""]: … |num=NUMERO {$ret=$num.text;} ;

Page 19: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

19

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“t1” se encuentra con el valor heredado de “t”(6) y el valor reconocido por “f”(“5” de tipo cadena), realiza la operación de multiplicación convirtiendo antes el “5” a tipo entero, y el resultado lo pasa como atributo heredado a “t1”.

t1 [int n1] returns [int resul=0;] : OPMULT num2=f num=t1[$n1*Integer.parseInt($num2.ret)] {$resul=$num.resul;} |…;

Page 20: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

20

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“t1” en este caso es una producción lambda, y la acción semántica lo único que realiza es el paso del valor del atributo heredado como atributo sintetizado hacia “t1”.

t1 [int n1] returns [int resul=0;] : … | {$resul=$n1;};

Page 21: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

21

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“t1” propaga el valor recibido(30) hacia “t” con la siguiente acción semántica.

t1 [int n1] returns [int resul=0;] : OPMULT num2=f num=t1[$n1*Integer.parseInt($num2.ret)] {$resul=$num.resul;}

Page 22: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

22

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“t” propaga el valor recibido(30) hacia “e” con la siguiente acción semántica.

t returns [int resul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;};

Page 23: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

23

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e” recibe el valor generado (30) como atributo sintetizado, y lo pasa a “e1” como valor heredado por si hubiese que realizar operaciones.

e returns [int resul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;};

Page 24: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

24

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e1” al ser una producción lambda devuelve en forma de atributo sintetizado el valor del atributo heredado recibido.

e1 [int n1] returns [int resul=0] : … | {$resul=$n1;};

Page 25: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

25

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“e” propaga el valor recibido de “e1” que es 30 hacia “a”.

e returns [int resul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;};

Page 26: EDT con ANTLR a e; e1t )e ( f Entrada: (1+5)*5; 1 a t1 f OPMULT numerote1 ft1 numero e1t OPSUMA ft1 numero 5 5 1 En esta diapositiva se muestra el árbol.

EDT con ANTLRa

e ;

e1t

)e(

f

Entrada: (1+5)*5;

26

a

t1

t1fOPMULT

numerot e1

f t1

numero

e1tOPSUMA

f t1

numero

5

5

1

“a” muestra por la salida estándar el resultado de la operación (1+5)*5. Que recibió de “e”.

a : num=e SEMICOLON {System.out.println("\n\nReconocida expresion aritmetica. Valor final: " + num); } a | ;