Automatas Unidad 2

July 25, 2017 | Author: Vik Anthony Aguilar | Category: Compiler, Programming Language, Computer Program, Software Engineering, Software Development
Share Embed Donate


Short Description

Download Automatas Unidad 2...

Description

UNIDAD 2 Generación de código intermedio

TEMAS 2.1 Notaciones 2.1.1 Prefija 2.1.2 Infija 2.2.3 Postfija 2.2 Representaciones de código Intermedio. 2.2.1 Notación Polaca 2.2.2 Código P 2.2.3 Triplos 2.2.4 Cuádruplos.

2.3 Esquema de generación. 2.3.1 Variables y constantes. 2.3.2 Expresiones. 2.3.3 Instrucción de asignación. 2.3.4 Instrucciones de control. 2.3.5 Funciones 2.3.6 Estructuras

Generación de código intermedio • El objetivo del código intermedio es reducir el numero de programas necesarios para construir traductores, y permitir mas fácilmente la transportabilidad de unas maquinas a otras. • Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explicita del programa fuente. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

Lenguajes intermedios • Los lenguajes intermedios nos sirven para representar la producción final de nuestro lenguaje fuente.

• Existen muchos lenguajes intermedios, la mayoría de ellos son una representación más simplificada del código original para facilitar la traducción hacia el código final.

Lenguajes intermedios cont.. • Por ejemplo al compilar un programa en C en Windows o DOS, se produce un código objeto con extensión .obj para que posteriormente el enlazador cree finalmente el código executable .exe

• En sistemas basados en Unix, también ocurre algo similar generándose un archivo .o y el executable a.out

Lenguajes intermedios cont..

• Otros lenguajes intermedios famosos son los generados para la máquina virtual de Java el

bytecode; y para la máquina virtual de .NET el MISL para luego ejecutarse en tiempo de ejecución JIT (Just in Time).

2.1 Notaciones Forma especial en la que se pueden expresar una expresión matemática en tres formas: • Prefija: el operador binario es analizado antes que sus operandos. • Infija: el operador binario es analizado entre sus operandos. • Sufija: el operador binario es analizado después que sus operandos.

2.1.1 Prefija Nos indica que el operador va antes de los operandos sus características principales son: • Los operandos conservan el mismo orden que la notación infija equivalente. • No requiere de paréntesis para indicar el orden de precedencia de operadores ya que el es una operación. • Se evalúa de izquierda a derecha hasta que encontremos el primer operador seguido inmediatamente de un par de operandos. • Se evalúa la expresión binaria y el resultado se cambia como un nuevo operando. • a+b-5

+ab-5

2.1.2 Infija • Es la forma mas común que utilizamos para escribir expresiones matemáticas, estas notaciones se refiere a que el operador esta entre los operandos. • La notación infija puede estar completamente parentizada o puede basarse en un esquema de precedencia de operadores así como el uso de paréntesis para invalidar los arreglos al expresar el orden de evaluación de una expresión: 3*4=12 3*4+2=14 3*(4+2)=18

2.2.3 Postfija • Llamada también polaca inversa, se usa para representar expresiones sin necesidad de paréntesis. • La notación postfija pone el operador al final de los dos operandos. • Ejemplos: • • •

a*b a*(b+c/d) a*b+c*d

ab* abcd/+* ab*cd*+

Ejemplo • Si deseamos representar las expresiones (2+(3*4)) = x y ((2+3)*4)= x en las tres notaciones mencionadas, el resultado sería: (2+(3*4)) = x

((2+3)*4) = x

Notación prefija

=+2*34x

=*+234x

Notación infija

2+3*4 = x

(2+3)*4 = x

Notación postfija

234*+x=

23+4*x=

Ejercicios • Realizar los siguientes ejercicios a notación infija, posfija, prefija. 1) (A+B)*C 2) 4+5/3 3) (2+4+3)*3/2 4) X- Y+Z*C 5) (X+5-2)/Y 6) 3*(X+Y)-4 7) (2+5)*8+7 8) 5*4+6/2

Infijo a postfijo Expr -> Expr + Término Expr -> Expr - Término Expr -> Término Término -> 0 Término -> 1 Término -> 2 ....

Término -> 9

Expr.t := Expr.t & Término.t & “+” Expr.t := Expr.t & Término.t & “-” Expr.t := Término.t Término.t := “0” Término.t := “1” Término.t := “2” .... Término.t := “9”

Infijo a postfijo Expr -> Expr1 + Término Expr -> Expr1 - Término Expr -> Término Término -> 0 Término -> 1 Término -> 2 ....

Término -> 9

Expr.t := “+” Expr.t := “-” Expr.t := Término.t Término.t Término.t .... Término.t

Expr1.t & Término.t & Expr1.t & Término.t & Término.t := “0” := “1” := “2” := “9”

Ejemplo Infijo a postfijo 1. Evalúe la expresión: 2+5-4 2. Construya el árbol de análisis sintáctico 3. Transforme a postfijo con las reglas semánticas dadas 4. Modifique las reglas semánticas para que los números se separen por coma

Arbol sintáctico (2+5-4) Expr

Expr

Expr

Término

2

+

-

Término

5

Término

4

Transformación Expr.t = Expr.t & Término.t & “-” Expr Expr.t = “2 5 + 4 -” Expr.t = Expr.t & Término.t & “+” Expr.t = “2 5 +” Expr

-

Término Término.t = “4”

Expr

+

Expr.t = “2”

Término Término.t = “5”

Término Término.t = “2”

2

5

4

Infijo a postfijo con comas Expr -> Expr1 + Término Expr.t := Expr1.t & Expr1.c & Término.t & “+” Expr -> Expr1 - Término Expr.c := Expr.t := “-” Expr -> Término Expr.c := Expr.t := Término -> 0 Expr.c := Término -> 1 Término.t Término -> 2 Término.t .... Término.t Término -> 9 .... Término.t

“” Expr1.t & Expr1.c & Término.t &

“” Término.t “,” := “0” := “1” := “2” := “9”

Transformación con comas Expr.t = Expr.t & Expr.c & Término.t & “-” Expr Expr.t = “2 , 5 + 4 -” Expr.c = “” Expr.t = Expr.t & Expr.c & Término.t & “+” Expr.t = “2 , 5 +” Expr Expr.c = “” Expr.t = “2” Expr.c = “,”

Expr

+

-

Término.t = “4”

Término Término.t = “5”

Término Término.t = “2”

2

Término

5

4

Transformación con comas Expr Expr.t = “7” Expr.c = “,”

Término Término.t = “7”

7

2.2 Representaciones de código Intermedio. 2.2.1 Notación Polaca 2.2.2 Código P 2.2.3 Triplos 2.2.4 Cuádruplos.

2.2 Representaciones de código Intermedio. • Existen maneras formales para representar código intermedio. • Estas notaciones simplifican la traducción de nuestro código fuente a nuestro código objeto ya que ahorran y acotan símbolos de la tabla de símbolos

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF