390 likes | 575 Views
Traductor EDT en ANTLR. Expresiones aritméticas. Gramática en ANTLR. /* Axioma */ axioma: a; a: l_e =e SEMICOLON { System.out.println ("<br> nReconocida expresion aritmetica . Valor final: " + $l_e.res ); } a | ; /* Reglas expresiones aritméticas */ e returns [ int res=0]:
E N D
Traductor EDT en ANTLR Expresiones aritméticas
Gramática en ANTLR /* Axioma */ axioma: a; a: l_e=e SEMICOLON { System.out.println("\n\nReconocidaexpresionaritmetica. Valor final: " + $l_e.res ); } a | ; /* Reglas expresiones aritméticas */ e returns [int res=0]: l_t=t l_e1=e1[$l_t.res] {$res = $l_e1.res;} ; e1 [int val] returns [int res=0]: OPSUMA l_t=t l_e1=e1[$val + $l_t.res] {$res = $l_e1.res;} | OPRESTA l_t=t l_e1=e1[$val - $l_t.res] {$res = $l_e1.res;} | {$res = $val;} ; t returns [int res=0]: l_f=f l_tl=t1[$l_f.res] {$res = $l_tl.res;} ;
Gramática en ANTLR t returns [int res=0]: l_f=f l_tl=t1[$l_f.res] {$res = $l_tl.res;} ; t1 [int val] returns [int res=0]: OPMULT l_f=f l_tl=t1[$val * $l_f.res] {$res = $l_tl.res;} | OPDIV l_f=f l_tl=t1[$val / $l_f.res] {$res = $l_tl.res;} | {$res = $val;} ; f returns [int res=0]: '(' l_e=e ')' {$res = $l_e.res;} | l_n=NUMERO {$res = Integer.parseInt($l_n.text);} ; NUMERO : '0'..'9'+ ; OPSUMA : '+'; OPRESTA : '-'; OPMULT : '*'; OPDIV : '/'; SEMICOLON: ';' '\r'? '\n'?;
Proceso de traducción • En la animación siguiente se muestra el proceso de traducción que sigue la expresión aritmética: (1+5*5); • En cada fotograma se muestra la parte del árbol sintáctico correspondiente a 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 • Árbol sintáctico completo, generado por la expresión: (1+5*5);
Proceso de traducción • Primera producción “a”, reconoce la(s) expresión(es) que terminan en “;”. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “e”, analiza y procesa la expresión completa • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “t”, analiza y procesa elementos terminales, expresiones dentro de paréntesis, y expresiones con productos y divisiones. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “f”, analiza y procesa elementos terminales y expresiones dentro de paréntesis. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “e”, analiza y procesa la expresión completa. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “t”, analiza y procesa elementos terminales, expresiones dentro de paréntesis, y expresiones con productos y divisiones. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “f”, analiza y procesa elementos terminales y expresiones dentro de paréntesis. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Elemento terminal “1”, se actualiza el atributo res de “f” con el valor numérico correspondiente al terminal leído. • Cadena involucrada en la producción (1+5*5); f.res=1 1
Proceso de traducción • Siguiente producción “t1”, recibe como parámetro un valor que utilizará como operando de un producto o división. • Cadena involucrada en la producción (1+5*5); t1.val=f.res 1
Proceso de traducción • Elemento terminal “λ”, cómo la producción es vacía, el atributo res se actualiza con el valor del parámetro de “t1”. • Cadena involucrada en la producción (1+5*5); t1.res=t1.val 1
Proceso de traducción • “t1” actualiza el valor del atributo res de “t” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); t.res=t1.res 1
Proceso de traducción • Siguiente producción “e1”, recibe como parámetro un valor que utilizará como operando de una suma o resta. • Cadena involucrada en la producción (1+5*5); e1.val=t.res 1
Proceso de traducción • Siguiente producción “t”, analiza y procesa elementos terminales, expresiones dentro de paréntesis, y expresiones con productos y divisiones. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Siguiente producción “f”, analiza y procesa elementos terminales y expresiones dentro de paréntesis. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Elemento terminal “5”, se actualiza el atributo res de “f” con el valor numérico correspondiente al terminal leído. • Cadena involucrada en la producción (1+5*5); f.res=5 5
Proceso de traducción • Siguiente producción “t1”, recibe como parámetro un valor que utilizará como operando de un producto o división. • Cadena involucrada en la producción (1+5*5); t1.val=f.res 5
Proceso de traducción • Siguiente producción “f”, analiza y procesa elementos terminales y expresiones dentro de paréntesis. • Cadena involucrada en la producción (1+5*5);
Proceso de traducción • Elemento terminal “5”, se actualiza el atributo res de “f” con el valor numérico correspondiente al terminal leído. • Cadena involucrada en la producción (1+5*5); f.res=5 5
Proceso de traducción • Siguiente producción “t1^”, recibe como parámetro un valor que utilizará como operando de un producto o división. En este caso se le pasa como operando el resultado del producto entre el valor devuelto por “f” y el atributo que usa como parámetro “t1” (el padre). • Cadena involucrada en la producción (1+5*5); 5 t1^.val= t1.val * f.res ^ 5
Proceso de traducción • Elemento terminal “λ”, cómo la producción es vacía, el atributo res se actualiza con el valor del parámetro de “t1”. • Cadena involucrada en la producción (1+5*5); t1.res=t1.val 25
Proceso de traducción • “t1^” actualiza el valor del atributo res de “t1” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); 25 t1.res=t1^.res ^
Proceso de traducción • “t1” actualiza el valor del atributo res de “t” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); t.res=t1.res 25
Proceso de traducción • Siguiente producción “e1^”, recibe como parámetro un valor que utilizará como operando de una suma o resta. En este caso se le pasa como operando el resultado del producto entre el valor devuelto por “t” y el atributo que usa como parámetro “e1” (el padre). • Cadena involucrada en la producción (1+5*5); 1 e1^.val= e1.val + t.res ^ 25
Proceso de traducción • Elemento terminal “λ”, cómo la producción es vacía, el atributo res se actualiza con el valor del parámetro de “e1”. • Cadena involucrada en la producción (1+5*5); e1.res=e1.val 26
Proceso de traducción • “e1^” actualiza el valor del atributo res de “e1” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); 26 e1.res=e1^.res ^
Proceso de traducción • “e1” actualiza el valor del atributo res de “e” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); 26 e.res=e1.res
Proceso de traducción • “e” actualiza el valor del atributo res de “f” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); f.res=e.res 26
Proceso de traducción • Siguiente producción “t1”, recibe como parámetro un valor que utilizará como operando de un producto o división. • Cadena involucrada en la producción (1+5*5); t1.val=f.res 26
Proceso de traducción • Elemento terminal “λ”, cómo la producción es vacía, el atributo res se actualiza con el valor del parámetro de “t1”. • Cadena involucrada en la producción (1+5*5); t1.res=t1.val 26
Proceso de traducción • “t1” actualiza el valor del atributo res de “t” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); t.res=t1.res 26
Proceso de traducción • Siguiente producción “e1”, recibe como parámetro un valor que utilizará como operando de una suma o resta. • Cadena involucrada en la producción (1+5*5); e1.val=t.res 26
Proceso de traducción • Elemento terminal “λ”, cómo la producción es vacía, el atributo res se actualiza con el valor del parámetro de “e1”. • Cadena involucrada en la producción (1+5*5); e1.res=e1.val 26
Proceso de traducción • “e1” actualiza el valor del atributo res de “e” con el valor de la expresión calculada. • Cadena involucrada en la producción (1+5*5); 26 e.res=e1.res
Proceso de traducción Resultado = e.res • Finalmente “a” recibe el valor de la expresión aritmética calculada en la producción “e” y se muestra por pantalla. • Cadena involucrada en la producción (1+5*5); 26