260 likes | 461 Views
a. Entrada: (1+5)*5;. e. ;. a. t. e1. EDT con ANTLR. f. t1. e. ). f. t1. (. OPMULT. t. e1. numero. 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. f.
E N D
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT t e1 numero 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. f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “1”). f returns [Stringret=""]: … | num=NUMERO {$ret=$num.text;} ; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT El valor de tipo cadena que llega de “f” se convierte a tipo entero y se pasa como atributo heredado a “t1”. t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT 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 [intresul=0;] : …| {$resul=$n1;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT El valor calculado como atributo sintetizado es propagado también por la producción “t”. t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT 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 [intresul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT t e1 numero f t1 t e1 5 OPSUMA 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. numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “5”). f returns [Stringret=""]: … | num=NUMERO {$ret=$num.text;} ; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT El valor de tipo cadena que llega de “f” se convierte a tipo entero y se pasa como atributo heredado a “t1”. t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT 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 [intresul=0;] : …| {$resul=$n1;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT El valor calculado como atributo sintetizado es propagado también por la producción “t” hacia “e1”. t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT 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 [intresul=0] : OPSUMA num2=t num=e1[$n1+$num2.resul] {$resul=$num.resul;} t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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 [intresul=0] : … | {$resul=$n1;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “e1” sigue propagando el valor sintetizado (6). e1 [int n1] returns [intresul=0] : OPSUMA num2=t num=e1[$n1+$num2.resul] {$resul=$num.resul;} t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “e” propaga el valor del atributo sintetizado hacia “f”. e returns [intresul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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 [Stringret=""]: | '(' exp=e ')' {$ret=Integer.toString($exp.resul);} t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “t” convierte a entero el valor del atributo sintetizado que recibe de “f” y lo pasa como atributo heredado a “t1”(6). t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT A “f” se asigna el valor reconocido por “numero” como una cadena(en este caso “5”) y la propaga hacia “t1”. f returns [Stringret=""]: … | num=NUMERO {$ret=$num.text;} ; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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 [intresul=0;] : OPMULT num2=f num=t1[$n1*Integer.parseInt($num2.ret)] {$resul=$num.resul;} |…; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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 [intresul=0;] : … | {$resul=$n1;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “t1” propaga el valor recibido(30) hacia “t” con la siguiente acción semántica. t1 [int n1] returns [intresul=0;] : OPMULT num2=f num=t1[$n1*Integer.parseInt($num2.ret)] {$resul=$num.resul;} t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “t” propaga el valor recibido(30) hacia “e” con la siguiente acción semántica. t returns [intresul=0;]: num1=f num=t1 [Integer.parseInt($num1.ret)] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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 [intresul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “e1” al ser una producción lambda devuelve en forma de atributo sintetizado el valor del atributo heredado recibido. e1 [int n1] returns [intresul=0] : … | {$resul=$n1;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “e” propaga el valor recibido de “e1” que es 30 hacia “a”. e returns [intresul=0]: num1=t num=e1 [$num1.resul] {$resul=$num.resul;}; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5
a Entrada: (1+5)*5; e ; a t e1 EDT con ANTLR f t1 e ) f t1 ( OPMULT “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\nReconocidaexpresionaritmetica. Valor final: " + num); } a | ; t e1 numero f t1 t e1 5 OPSUMA numero f t1 1 numero 5