tag:blogger.com,1999:blog-62828174956019709902024-03-05T04:47:39.981-06:00Compiladores: 7mo 17mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-6282817495601970990.post-1427897969740908242011-05-18T10:11:00.001-05:002011-05-18T10:11:31.355-05:00Documentos Mtra Theria Irasema Samperio Monroy<a name='more'></a>Documentos de gran apoyo para comprender mejor todo lo referente a los compiladores.<br />
<br />
<span class="Apple-style-span" style="font-size: large;"><a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/cursodecompiladores2011.ppt?w=48578d91">Diapositivas con el curso de Compiladores</a></span><br />
<br />
<a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/Apuntes_B...pdf?w=7f845272"><span class="Apple-style-span" style="font-size: large;">Apuntes Básicos de Compiladores</span></a>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com0tag:blogger.com,1999:blog-6282817495601970990.post-49167109499513362192011-05-18T10:11:00.000-05:002011-05-18T10:11:03.819-05:00LINEA DEL TIEMPO DE LOS COMPILADORES<h3 align="center" style="margin: 6pt 0cm; text-align: center;"><span lang="ES" style="color: #953735; font-family: "Showcard Gothic"; font-size: 36pt; mso-bidi-font-size: 12.0pt; mso-effects-glow-alpha: 40.0%; mso-effects-glow-color: #EB2722; mso-effects-glow-rad: 18.0pt; mso-effects-glow-themecolor: accent2; mso-style-textfill-fill-alpha: 100.0%; mso-style-textfill-fill-color: #953735; mso-style-textfill-fill-themecolor: accent2; mso-themecolor: accent2; mso-themeshade: 191;"><a name='more'></a>Compiladores<o:p></o:p></span></h3><div class="MsoNormal" style="margin: 6pt 0cm; text-align: justify;"><br />
</div><h4 align="center" style="text-align: center;"><span lang="ES" style="color: #0070c0; font-family: "Cooper Black","serif"; font-size: 16pt; mso-bidi-font-size: 10.0pt; mso-effects-glow-alpha: 40.0%; mso-effects-glow-color: #267DE6; mso-effects-glow-rad: 11.0pt; mso-effects-glow-themecolor: accent1;">Visión histórica del desarrollo de los compiladores<o:p></o:p></span></h4><div class="MsoNormal"><br />
</div><div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1946, se desarrolla el primer ordenador digital. Las instrucciones que se ejecutaban eran códigos numéricos, lenguaje de máquina., esto es engorroso, entonces surgen los ensamblador. Al inicio el programa se escribía mediante claves y luego se traducía manualmente al lenguaje de máquina. Cuando esto lo hizo la misma máquina, a este trabajo se le llamó ensamblar el programa.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1950, John Backus dirige una investigación en IBM en un lenguaje algebraico<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1954, se comienza a desarrollar FORTRAN<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1957, FORTRAN se utiliza en <st1:personname productid="la IBM" w:st="on">la IBM</st1:personname> modelo 704<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Surge el concepto traductor<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">El primer compilador de FORTRAN tardó 18 años-persona en realizarse<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">FORTRAN era dependiente de la máquina<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Paralelamente al desarrollo de FORTRAN en América, en Europa surge una corriente que pretende que los lenguajes fuesen independientes de la máquina, esta corriente estaba influida por los trabajos sobre GLC de Chomsky<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Surge un grupo Europeo encabezado por F.L. Bauer, en la que participó ACM y John Backus. De este grupo surge un informe que define un Lenguaje Algebraico Internacional, publicado en Zurich en 1958<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1969, aparece Algol 60, Junto con los lenguajes también la técnica de los compiladores avanza<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">1958, Strong y otros proponen una solución al problema de que un compilador fuera portable, y esta era dividir al compilador en dos fases “front end” (analiza el programa fuente) y “back end” (genera código objeto para la máquina objeto).<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">El puente de unión era un lenguaje intermedio denominado UNCOL –Universal Computer Oriented Language(no funcionó)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento lexicográfico de los lenguajes<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una guía para el desarrollo del análisis sintáctico<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">1959, Sheridan describe un método de parsing de FORTRAN para introducir paréntesis en una expresión<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; display: none; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Wingdings; mso-hide: all;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 9.0pt;">En los 60’s se desarrollan diversos métodos de parsers ascendentes y descendentes<span style="display: none; mso-hide: all;"><o:p></o:p></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="EN-US" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;"><span style="mso-spacerun: yes;"> </span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Floyd más adelante introduce la técnica de precedencia de operadores y uso de funciones de precedencia<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1961, se usa por primera vez un parsing descendente recursivo<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">En los 60’s se estudia el paso de parámetros por nombre, valor y referencia y se incluyen los procedimientos recursivos para Algol 60<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Se desarrolla la localización dinámica de datos<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1968, se estudia y definen las GLC, los parsers predictivos y la eliminación de recursividad izquierda<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">Ø<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">1975, aparece LEX generador automático de analizadores léxicos a partir de expresiones regulares bajo UNIX<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">A mitad de los 70’s Johnson crea YACC para UNIX (generador de analizadores sintácticos)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; mso-bidi-font-size: 8.0pt;">Ahora un compilador de divide en varias fases<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 72pt; mso-add-space: auto; mso-list: l0 level2 lfo1; text-align: justify; text-indent: -18pt;"><span lang="ES" style="color: #002060; font-family: "Courier New"; mso-bidi-font-size: 8.0pt; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span><span lang="ES" style="color: #002060; font-family: Papyrus; font-size: 16pt; mso-bidi-font-size: 8.0pt;"><span style="font-size: small;">El último lenguaje de programación de amplia aceptación es JAVA (es interpretado)<o:p></o:p></span></span></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com1tag:blogger.com,1999:blog-6282817495601970990.post-7586747710807275902011-05-18T10:10:00.000-05:002011-05-18T10:10:25.010-05:00UNIDAD I: CONCEPTOS BASICOS DE COMPILADORES<div class="separator" style="clear: both; text-align: center;"></div><a name='more'></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfPKJDIxoY_4upfegFhRl0tQkaM9GWNybDTNZ6qqnl1A1FHafGCMqZxyFxiuh4QMbC4FbMlTjCyJ1YwC0EVjFDA4cQYCMlcD7a5tskUxrDRH2QP29yQOJcRjBWwkox9FQBkgs8s5diW5_/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a><br />
<div style="color: black; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: center; unicode-bidi: embed;"><span style="font-size: x-large; font-style: italic; font-weight: bold;">UNIDAD 1</span><br />
<span style="font-size: x-large; font-style: italic; font-weight: bold;">"CONCEPTOS BASICOS”</span><span style="font-size: x-large; font-style: italic; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic; font-weight: bold;"> </span> </div><div style="color: blue; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: large; font-weight: bold;">1.1Lenguaje de programación</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 80%; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Notación formal para describir algoritmos o funciones que serán</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 80%; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> ejecutadas por un ordenador.</span></div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 80%; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><b><span style="font-size: small;"><br />
</span></b></div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><b><span style="background-color: orange; font-size: small;"><span style="background-color: #f3f3f3;"></span></span><span style="font-size: small;"> </span></b></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 80%; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><b style="color: #38761d;">1.1.1Clasificacion de los lenguajes de programacion</b></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">Según su grado de independencia de la máquina </span><span style="font-size: small;">(lenguaje máquina, ensamblador, de medio nivel, de alto nivel, orientados a problemas concretos.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">Según la forma de sus instrucciones </span><span style="font-size: small;">(Lenguajes imperativos o procedimentales, declarativos, concurrentes, orientados a objetos.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">Por generaciones </span><span style="font-size: small;">(1a generación, 2a generación, 3a generación, 4a generación, 5a generación, generación orientada a objetos, visual, internet).</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><a href="http://www.youtube.com/watch?v=qFSUiDGh6RE&feature=related">Video:Evolucion de los Lenguajes de Programacion</a> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.1.2Ventajas de los Lenguajes de Alto Nivel</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span><span style="font-size: small; font-weight: bold;"> </span></div><ul style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><li><span style="font-size: small;">No se necesita conocer la forma en que se colocan los datos en memoria.</span></li>
<li><span style="font-size: small;"> </span><span style="font-size: small;"> </span><span style="font-size: small;">Gran variedad de estructuras de control.</span></li>
<li><span style="font-size: small;"> Más faciles de aprender.</span></li>
<li><span style="font-size: small;">Mayor capacidad de la creación de estructura de datos.</span></li>
<li><span style="font-size: small;">Los programas se depúran más facilmente que los escritos en lenguaje maquina o ensamblador.</span></li>
</ul><ul style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><li><span style="font-size: small;">Relativamente independientes de la maquina.</span></li>
</ul><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="http://www.youtube.com/watch?v=QRrAa8k-Las&feature=relmfu">Video:Breve esplicacion sobre que son y cuales son las caracteristicas de los lenguajes alto nivel</a> </span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"> </span> </div><div style="color: blue; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: large; font-weight: bold; letter-spacing: 0.5pt;">1.2Procesadores de lenguaje</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Para que un ordenador comprenda un lenguaje, necesita </span><span style="font-size: small; font-style: italic;">procesarse, por medio de un procesador de lenguaje como traductores, compiladores, desensambladores, que realizan ciertas operaciones con los lenguajes. </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"> </span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Traductor</span></u><u><span style="font-weight: bold;"> </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;"> </span></u></span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">LenguajeFuente--->Lenguaje interprete---->Lenguaje Objeto</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Ensamblador </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;"> </span></u></span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Lenguaje ensamblador -Ensamblador-> Lenguaje maquina</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Compilador</span></u><u><span style="font-weight: bold;"> </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 16.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;"> </span></u></span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Lenguajede alto nivel --Compilador-> Lenguaje maquina</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: blue; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: large;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="color: blue; font-size: large; font-weight: bold;">1.3PROCESO DE COMPILACIÓN MONTAJE Y EJECUCIÓN</span><span style="font-size: small; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span></div><div class="separator" style="clear: both; color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8tq1_NUF_B-f-k9svsRTQQTvK_IJloIcLm57iDkxo3Jp9nqRVmOeHyvXbFX9Tu4ooSNtK-6TGDfESYfhBifHo3A-6sQr7abibdiza6ycclsqCo2KKbxlw5gjr7mStDIqGQWhKOY05AXvy/s1600/pcym.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8tq1_NUF_B-f-k9svsRTQQTvK_IJloIcLm57iDkxo3Jp9nqRVmOeHyvXbFX9Tu4ooSNtK-6TGDfESYfhBifHo3A-6sQr7abibdiza6ycclsqCo2KKbxlw5gjr7mStDIqGQWhKOY05AXvy/s400/pcym.jpg" width="400" /></a></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic; font-weight: bold;">Tiempo de Compilación</span><span style="font-size: small; font-style: italic;">. Tiempo que se necesita para traducir un lenguaje de alto nivel a lenguaje de bajo nivel. </span><span style="font-size: small; font-style: italic;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic; font-weight: bold;">Tiempo </span><span style="font-size: small; font-style: italic; font-weight: bold;">de ejecución. </span><span style="font-size: small; font-style: italic;">Tiempo que tarda en ejecutarse un programa objeto.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"> </span> </div><div class="separator" style="clear: both; color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhue9rwYozUiGeoi0NGCEeylLh0oV4TU5ze3uj62FA8GRUTsrsK8PQ1Y1HHC6X38WsVswcrWyrowifLUaWDmr7tmvvgMYRRl5pl9JV8rL40w6O9uY7N6SxeyNgyEGmYSe_0ZjY1WHLNoi7Y/s1600/i.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhue9rwYozUiGeoi0NGCEeylLh0oV4TU5ze3uj62FA8GRUTsrsK8PQ1Y1HHC6X38WsVswcrWyrowifLUaWDmr7tmvvgMYRRl5pl9JV8rL40w6O9uY7N6SxeyNgyEGmYSe_0ZjY1WHLNoi7Y/s400/i.jpg" width="400" /> </a></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Depuradores </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Herrramientas</span><span style="font-size: small;"> que permiten encontrar y corregir errores de los programas (suelen ir ligados a los compiladores)</span><span style="font-size: small;"> </span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Analizadores de rendimiento </span></u><u><span style="font-weight: bold;"> </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Herramientas que permiten examinar el comportamiento de los programas en tiempo de ejecución, permitiendo comprobar qué zonas de código trabajan eficientemente y cuáles deberían ser revisadas por su bajo rendimiento.</span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 10.8pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Optimizadores de código </span></u><u><span style="font-weight: bold;"> </span></u></span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Herramientas independientes o están incluidas en los compiladores que optimizan la velocidad de ejecución, tamaño de código ejecutable, eliminación de código muerto o no utilizado, funciones no utilizadas, etc.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Compresores </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Herramienta habitual para reducir el tamaño de archivos, (ficheros ejecutables). WIN ZIP</span><span style="font-size: small;"> </span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><u><span style="font-weight: bold;">Preprocesadores </span></u></span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Caso especial de traductor. Traduce un lenguaje de alto nivel a “otro”, cuando el primero no puede pasar a lenguaje máquina directamente. Procesan un texto fuente modificándolo en cierta forma previamente a la compilación.</span><span style="font-size: small;"> </span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><u><span style="font-weight: bold;">Formateadores</span></u></span></div><div style="color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Establen</span><span style="font-size: small;"> cierto “formato”. De muchos tipos y diferentes fines: formatear texto, formatear ecuaciones, </span><span style="font-size: small;"><u>formatear programas</u></span><span style="font-size: small;"> (resaltan la sintaxis a su estructura para lo cual es necesario conocer la sintaxis del programa a formatear). </span><span style="font-size: small;">Conversores</span><span style="font-size: small;"> de formato. </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">Editores </span></u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Los editores de lenguajes de programación con sintaxis resaltada por medio de colores o tipos de letra permiten llamar la atención del programador en el momento mismo que está escribiendo el programa, sin necesidad de compilar, dado que llevan incorporada la sintaxis del lenguaje.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: blue; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: large; font-weight: bold;">1.4Fases de un compilador</span></div><div class="separator" style="clear: both; color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfPKJDIxoY_4upfegFhRl0tQkaM9GWNybDTNZ6qqnl1A1FHafGCMqZxyFxiuh4QMbC4FbMlTjCyJ1YwC0EVjFDA4cQYCMlcD7a5tskUxrDRH2QP29yQOJcRjBWwkox9FQBkgs8s5diW5_/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfPKJDIxoY_4upfegFhRl0tQkaM9GWNybDTNZ6qqnl1A1FHafGCMqZxyFxiuh4QMbC4FbMlTjCyJ1YwC0EVjFDA4cQYCMlcD7a5tskUxrDRH2QP29yQOJcRjBWwkox9FQBkgs8s5diW5_/s400/Dibujo.jpg" width="400" /></a></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> Para cada lenguaje de programación se requiere un compilador separado.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> El compilador traduce todo el </span><span style="font-size: small;">programa </span><span style="font-size: small;">antes de ejecutarlo.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> Los programas compilados se ejecutan más rápido que los interpretados, debido a que han sido completamente traducidos a lenguaje máquina.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> Informa al usuario de la presencia de errores en el programa fuente.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> Poseen un editor integrado con un sistema de coloreado para los comandos, funciones, variables y demás partes de un programa.</span></div><div class="separator" style="clear: both; color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTOJNL8vVzBfn6p3du2rrRCb0a-7veJpgh2yib8WT76cfA3XzIsxDvWXZesOtplqFNJvVNaX0pHojjDiC84sPfrGCDFfWtJc7rLhk3GjjqPiGxPJsZsUZ42ScJnRxrJQrkAr-IoqERZgQO/s1600/Dibujo1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTOJNL8vVzBfn6p3du2rrRCb0a-7veJpgh2yib8WT76cfA3XzIsxDvWXZesOtplqFNJvVNaX0pHojjDiC84sPfrGCDFfWtJc7rLhk3GjjqPiGxPJsZsUZ42ScJnRxrJQrkAr-IoqERZgQO/s400/Dibujo1.jpg" width="400" /></a></span></div><div class="separator" style="clear: both; color: black; font-family: Georgia,"Times New Roman",serif; text-align: justify;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WyUjqF8tNRvEgjTuwk-UbKwkUXeMdHL94G8PgBaxTxrQJtJPFWFIaz1p_KXS2GPXI1o8ZWRKgoFaimwfvUgB-zbLORYkm3vX1_4b1pyAu4ltsbu1ZmLD5n2STABi-pLh5hRUV-SuINnC/s1600/Dibujo2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WyUjqF8tNRvEgjTuwk-UbKwkUXeMdHL94G8PgBaxTxrQJtJPFWFIaz1p_KXS2GPXI1o8ZWRKgoFaimwfvUgB-zbLORYkm3vX1_4b1pyAu4ltsbu1ZmLD5n2STABi-pLh5hRUV-SuINnC/s400/Dibujo2.jpg" width="400" /></a></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span> </div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">1.4.1Etapa Inicial Compilación </span></u><u><span style="font-weight: bold;"> </span></u></span></div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;"> </span><span style="font-size: small; font-weight: bold;">1.4.1.1Análisis </span><span style="font-size: small; font-weight: bold;">lineal </span><span style="font-size: small; font-weight: bold;">o léxico</span> </div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;">En </span><span style="font-size: small;">esta etapa la cadena </span><span style="font-size: small;">de caracteres </span><span style="font-size: small;">que constituye el programa fuente se </span><span style="font-size: small;">lee</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;">de </span><span style="font-size: small;">izquierda a derecha (de arriba hacia abajo) y se agrupa en </span><span style="font-size: small; font-style: italic;">componentes léxicos </span><span style="font-size: small; font-style: italic;">que son secuencias de caracteres que tienen un significado colectivo. </span><span style="font-size: small; font-style: italic;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;">NOTA</span><span style="font-size: small; font-style: italic;">: Los espacios en blanco y comentarios se eliminan durante el análisis léxico. </span><span style="font-size: small; font-style: italic;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"><span style="color: #274e13;">1.4.1.2Análisis jerárquico</span> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span><span style="font-size: small; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;">En </span><span style="font-size: small;">esta etapa los caracteres o componentes léxicos se agrupan jerárquicamente en colecciones anidadas con un significado colectivo. La representación gráfica del programa fuente se hace mediante un </span><span style="font-size: small; font-style: italic;">árbol de análisis sintáctico (jerarquías</span><span style="font-size: small; font-style: italic;">).</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic; font-weight: bold;"> </span></div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.1.3Análisis </span><span style="font-size: small; font-weight: bold;">semántico</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;">En esta etapa se revisa el programa fuente para tratar de encontrar errores semánticos y se reúne la información de los tipos para la fase posterior de generación de código. </span><span style="font-size: small;">Utiliza la estructura jerárquica.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;">Verificador </span><span style="font-size: small; font-style: italic;">de tipos.- El compilador verifica si cada operador tiene </span><span style="font-size: small; font-style: italic;">operandos</span><span style="font-size: small; font-style: italic;"> permitidos por la especificación del lenguaje fuente.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"><a href="http://www.youtube.com/watch?v=zX8PCiuhizg">Video:Explicacion de la parte lexica y sintactica del compilador</a> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.1.4 Generación de código intermedio. </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span><span style="font-size: small; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Algunos </span><span style="font-size: small;">compiladores generan una representación intermedia explícita del programa fuente. </span><span style="font-size: small;">El </span><span style="font-size: small;">código intermedio debe cumplir con dos propiedades importantes: ser fácil de producir y fácil de traducir al programa objeto. </span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.38in; margin-top: 0pt; text-align: justify; text-indent: -0.38in; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"> </span> </div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 19.2pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">1.4.2 Etapa Final Compilación </span></u></span></div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.2.1 Optimización de código</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span><span style="font-size: small;"> </span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Trata </span><span style="font-size: small;">de mejorar el código intermedio de modo que resulte un código máquina más fácil de ejecutar</span><span style="font-size: small;">.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;"> </span></div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.2.2 Generación de código Fase final de un compilador</span><span style="font-size: small; font-weight: bold;">.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 19.2pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;">Por lo general, consiste en código máquina o ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traducen a una secuencia de instrucciones de máquina que ejecutan la misma tarea<u>.</u></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 19.2pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;"> </span></u></span> </div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 19.2pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><u><span style="font-weight: bold;">1.4.3Herramientas de Compilación </span></u></span></div><div style="color: #38761d; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.3.1 Administrador </span><span style="font-size: small; font-weight: bold;">de la Tabla de Símbolos </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Una función esencial del compilador es registrar los identificadores utilizados en el programa fuente y reunir la información sobre los atributos de cada identificador. </span><span style="font-size: small; font-style: italic;">Información que proporcionan los atributos: memoria asignada, tipo, ámbito (locales, globales). </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"><a href="http://www.youtube.com/watch?v=XdyaOu_dggY&feature=related">Explicacion de la tabla de simbolos</a> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-style: italic;"> </span><span style="font-size: small; font-style: italic;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span></div><div style="color: #274e13; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small; font-weight: bold;">1.4.3.2Manejador de Errores </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Cada fase del compilador puede encontrar errores. Después de detectar un error, cada fase debe tratar de alguna forma ese error para poder continuar la compilación, permitiendo la detección de más errores en el programa </span><span style="font-size: small;">fuente.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="color: blue; font-size: large; font-weight: bold;">1.5Jerarquías de Chomsky</span><span style="font-size: small; font-weight: bold;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;"> </span></div><div class="separator" style="clear: both; color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIj7roidYSFxeceQq-ahzR6ITzkev5LexltzcK3rim689YG0ZRdaca3RJ1hUP7Qy4SNCw3dzVOPeOOAGizfVBhC-Og9Fgq8kszCbb9CVrMOq8wHtdjVyiNdW3JcdrBj0PhPk3-cX-wMSVZ/s1600/Dibujo3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIj7roidYSFxeceQq-ahzR6ITzkev5LexltzcK3rim689YG0ZRdaca3RJ1hUP7Qy4SNCw3dzVOPeOOAGizfVBhC-Og9Fgq8kszCbb9CVrMOq8wHtdjVyiNdW3JcdrBj0PhPk3-cX-wMSVZ/s400/Dibujo3.jpg" width="400" /></a></span> </div><div class="separator" style="clear: both; color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><a href="http://www.youtube.com/watch?v=oITebW268nk">Video sobre las gramaticas de Chomsky</a> </span></div><div class="separator" style="clear: both; color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 12pt; text-align: justify; unicode-bidi: embed;"><br />
</div><div style="color: blue; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: large; font-weight: bold;">1.6Formas de Backus Naur (Notación BNF) </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">La notación BNF o gramática independiente de contexto permite describir la sintaxis de las construcciones de los lenguajes de programación, utilizando los siguientes </span><span style="font-size: small;">meta símbolos:</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">< </span><span style="font-size: small;">> Encierra conceptos definidos o por definir (se utiliza para los no terminales en una gramática</span><span style="font-size: small;">).</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;">: : = Para definir o indicar </span><span style="font-size: small;">equivalencia</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;">| Separa las distintas alternativas “ “ Indica que el símbolo entre comillas es un carácter que forma parte de la sintaxis del lenguaje</span><span style="font-size: small;">.</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><br />
</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;">( ) Para agrupaciones </span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">Por </span><span style="font-size: small;">ejemplo, para definir un identificador (nombre que se utiliza para identificar una variable) en BNF: </span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"><</span><span style="font-size: small;">identificador> ::= <letra> | <letra> <letra> | <letra> <digito</span><span style="font-size: small;">></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;"><letra> ::= a | b | c | d | e | . . . | </span><span style="font-size: small;">z</span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;"> </span><span style="font-size: small;"><digito> ::= 0 | 1 | 2 | 3 | 4 | . . . | 9 </span><span style="font-size: small;"> </span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: justify; unicode-bidi: embed;"><span style="font-size: small;">En </span><span style="font-size: small;">este caso, </span><span style="font-size: small;">a,b,c,d,e</span><span style="font-size: small;">,...,z y 0,1,2,3,...,9 son </span><span style="font-size: small; font-style: italic;">terminales y el resto no terminales. </span></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com0tag:blogger.com,1999:blog-6282817495601970990.post-88691476135316810982011-05-18T10:04:00.000-05:002011-05-18T10:04:32.152-05:00UNIDAD 2: ANÁLISIS LÉXICO<div class="MsoNormal" style="text-align: center;"><span class="Apple-style-span" style="color: #e06666;"><span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><b></b></span></span></span><br />
<span class="Apple-style-span" style="color: #e06666;"><span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><b></b></span></span></span><br />
<span class="Apple-style-span" style="color: #e06666;"><span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><b><a name='more'></a>ANÁLISIS LÉXICO</b></span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #e06666;"><span class="Apple-style-span" style="font-size: x-large;"><br />
</span></span></span><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Un </span><b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">analizador léxico</span></b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> o </span><b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">analizador lexicográfico</span></b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> (en inglés </span><i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">scanner</span></i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">) es un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de </span><i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">tokens</span></i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> (componentes léxicos) o símbolos. Estos </span><i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">tokens</span></i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> sirven para una posterior etapa del proceso de traducción, siendo la entrada para el analizador sintáctico (en inglés </span><i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">parser</span></i><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">).</span></span><b><i><span lang="ES" style="font-family: Arial, sans-serif; font-size: 11pt;"></span></i></b></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/pO20YCAmDN8?feature=player_embedded' frameborder='0'></iframe> </div><div class="separator" style="clear: both; text-align: center;">Interesante video sobre el análisis léxico</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
<br />
<b><span lang="ES" style="font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #3d85c6;">2.1 Función </span></span></span></span></b><span lang="ES"><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><b><span class="Apple-style-span" style="color: #3d85c6;">del análisis lexicográfico</span></b></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span class="Apple-style-span" style="font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: large;"><b><br />
</b></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">El analizador léxico es la primera fase el compilador. Función principal del analizador léxico: Leer los caracteres de entrada y elaborar como salida una secuencia de </span><i><span class="Apple-style-span" style="font-size: small;">componentes léxicos </span></i><span class="Apple-style-span" style="font-size: small;">que utiliza el analizador sintáctico para hacer el análisis. Esta iteración se esquematiza como sigue:</span></span></div><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<div class="MsoNormal" style="text-align: justify;"><span lang="ES" style="font-size: 12pt;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwho6ygodf7OBUObAHbQCzhIybfwU5ZPPjBS-MhxIeKfkPPsi9sKY0-Zf9EyeQD-Dnzh6pjQHDCL_XWbDX_8mrJhLCkpmA5LZ9tjHxM9DL7D71fH-1qZOzfHVBsypZDv7-3RbhtkE_Jx9m/s1600/imagen1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwho6ygodf7OBUObAHbQCzhIybfwU5ZPPjBS-MhxIeKfkPPsi9sKY0-Zf9EyeQD-Dnzh6pjQHDCL_XWbDX_8mrJhLCkpmA5LZ9tjHxM9DL7D71fH-1qZOzfHVBsypZDv7-3RbhtkE_Jx9m/s400/imagen1.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div><div class="Default" style="text-align: justify;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Funciones secundarias: Como el analizador léxico es la parte del compilador que lee el texto fuente, también realiza las siguientes funciones secundarias: </span></div><div class="Default" style="margin-bottom: 6.5pt;"></div><ul><li style="text-align: justify;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Eliminar del programa fuente comentarios y espacios en blanco (caracteres de espacio en blanco, caracteres TAB, caracteres de nueva línea).</span></li>
<li style="text-align: justify;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Relacionar los mensajes de error con el lenguaje fuente. </span></li>
</ul><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<div class="Default"><b><span class="Apple-style-span" style="color: #6aa84f;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Razones para dividir la fase de análisis de la compilación en análisis léxico y análisis sintáctico </span></span></b><span style="font-size: 10.5pt;"></span></div><div class="Default"><b><span class="Apple-style-span" style="color: #6aa84f;"><br />
</span></b></div><div class="Default" style="margin-bottom: 6.95pt;"></div><ol><li><i>Permite un diseño más sencillo. </i>Esta división permite simplificar una u otra de dichas fases. Por ejemplo, el análisis sintáctico es más complejo si considera espacios en blanco o los comentarios.</li>
<li><i>Se mejora la eficiencia del compilador</i>. Utilizando técnicas independientes para el análisis léxico, el programa fuente puede leer y dividir en componentes léxicos más especializados.</li>
<li><i>Se mejora la transportabilidad del compilador</i>. Los símbolos especiales o estándar del programa fuente se pueden aislar en el analizador léxico, permitiendo que el programa fuente pueda pasar de una fase a otra. </li>
</ol><div style="text-align: center;"><br />
<b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;">2.2 Lexemas, expresiones regulares y tokens</span></span></span></span></b><b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span></span></b></div><b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"></span></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"></span></b><br />
<b><span lang="ES"><div class="MsoNormal" style="text-align: center;"></div></span><div class="MsoNormal" style="text-align: center;"></div></b><br />
<div class="MsoNormal" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkW7lZUk6fVtukmvKMLOSuESSHZeu1Eba6QD6EhUwPitoVza1avndeZhRYxRMcwvzqZw9k_faobE8ekWesp_N53rlka8xqALhEGj_iYVPXDxtHVnnur5PTO_myrZIpj0LZEpUxqhQWVRDl/s1600/imagen2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkW7lZUk6fVtukmvKMLOSuESSHZeu1Eba6QD6EhUwPitoVza1avndeZhRYxRMcwvzqZw9k_faobE8ekWesp_N53rlka8xqALhEGj_iYVPXDxtHVnnur5PTO_myrZIpj0LZEpUxqhQWVRDl/s400/imagen2.jpg" width="400" /></a></div><div class="MsoNormal" style="text-align: center;"><b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;"> </span></span></span></span></b></div><div class="MsoNormal" style="text-align: left;"></div><div class="Default"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">Componente léxico (token) </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">Son las unidades lógicas que genera el analizador léxico. Formar caracteres en </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">tokens </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">es muy parecido a formar palabras en un lenguaje natural. Es el conjunto de cadenas de entrada que produce como salida el mismo componente léxico. Cada </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">token </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">es una secuencia de caracteres que representa una unidad de información en el programa fuente. Los componentes léxicos más comunes son los siguientes: </span></span></span></div><div class="Default"><span class="Apple-style-span" style="color: black;"><i><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></span></i></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><i><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-style: normal;">1.- palabras clave o reservadas </span></span></span></i></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">2.- operadores aritméticos </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">3.- operadores relacionales </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">4.- operadores lógicos </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">5.- operador de asignación </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">6.- identificadores </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">7.- constantes </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">8.- cadenas </span></span></span></div><div class="Default" style="margin-bottom: 0.5pt;"><span style="font-size: 10.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">9.- literales</span></span><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span><br />
<span style="font-size: 10.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></span></span><span style="font-size: 10.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span><span style="font-size: 10.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span><span style="font-size: 10.5pt;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span><br />
<div class="Default"><span class="Apple-style-span" style="font-size: small;">Identificador</span><b><span class="Apple-style-span" style="font-size: small;">. </span></b><span class="Apple-style-span" style="font-size: small;">(Letra seguida de letras y dígitos). Se puede definir a partir de dos símbolos: letra y dígito. </span></div><div class="Default"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">letra (letra|dígito)*</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal"><b><i><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Nota: </span></span></i></b><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Una expresión regular se construye a partir de expresiones regulares más simples, hasta llegar a símbolos del alfabeto: </span></span></div><div class="MsoNormal"><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Constante entera </span></span></div><div class="MsoNormal"><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">(sin signo) digito</span></span><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">+ </span></span><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">(con signo) (+|-) digito</span></span><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">+ </span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="color: black; font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Constante de punto flotante sin exponente</span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">(+|-) digito</span></span><sup><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+</span></span></sup><span lang="ES"><span class="Apple-style-span" style="font-size: small;">.digito</span></span><sup><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+</span></span></sup></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">Por conveniencia de notación, es deseable dar nombres a las expresiones regulares. Para distinguir los nombres de los símbolos, se imprimen en </span><b><span class="Apple-style-span" style="font-size: small;">negritas </span></b><span class="Apple-style-span" style="font-size: small;">los nombres de las definiciones regulares.</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: small;">id </span></span></b><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">letra(letra|digito)* </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: small;">const </span></span></b><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digito</span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+ </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: small;">punto_flotante </span></span></b><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">(+|-)digito</span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+</span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">.digito</span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">Por ejemplo, como ya se estableció antes, el conjunto de identificadores es el conjunto de cadenas de letras y dígitos que empiezan con una letra. </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">La definición o expresión regular para ese conjunto quedaría como sigue:</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">letra </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">A|B|C|...|Z|a|b|c|...|z </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digito </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">0|1|2|3|...|9 </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">id </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">letra(letra|digito)*</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">Definición regular para el conjunto de números sin signo como 5280, 39.37, 6.336E4, 1.89E-4</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digito </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">0|1|2|3|...|9 </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digitos </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digito digito* </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">fraccion_optativa </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">.digitos|€ </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">exponente_optativo </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">(E(+|-|€) digitos)|€ </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">num </span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="font-size: small;">à </span></span><span lang="ES"><span class="Apple-style-span" style="font-size: small;">digitos fraccion_optativa exponente_optativo</span></span></div><br />
<div class="Default"><span class="Apple-style-span" style="font-size: small;">Las </span><b><span class="Apple-style-span" style="font-size: small;">expresiones regulares </span></b><span class="Apple-style-span" style="font-size: small;">se utilizan para describir los componentes léxicos de un lenguaje o tokens. Las expresiones regulares utilizan varios tipos de operadores para definir los componentes léxicos: </span></div><div class="Default"><br />
</div><div class="Default" style="margin: 0cm 0cm 2.15pt 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol;"><span class="Apple-style-span" style="font-size: small;">·</span><span style="font-family: "Times New Roman";"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><span class="Apple-style-span" style="font-size: small;">Paréntesis. Para agrupar símbolos </span></div><div class="Default" style="margin: 0cm 0cm 2.15pt 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol;"><span class="Apple-style-span" style="font-size: small;">·</span><span style="font-family: "Times New Roman";"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><span class="Apple-style-span" style="font-size: small;">Operación concatenación. Se permite la concatenación de cadenas. </span></div><div class="Default" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol;"><span class="Apple-style-span" style="font-size: small;">·</span><span style="font-family: "Times New Roman";"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><span class="Apple-style-span" style="font-size: small;">Operación alternativa. Se representa por |, y permite la elección entre dos o más alternativas. </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">Con estos elementos podemos definir los componentes léxicos. Por ejemplo, para desarrollar la expresión regular para </span><b><i><span class="Apple-style-span" style="font-size: small;">identificador, </span></i></b><span class="Apple-style-span" style="font-size: small;">definimos su patrón y a partir se define su expresión regular.</span></span></div><br />
<div class="Default"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Lexema </span></span></span></b><span style="font-size: 10.5pt;"></span></div><div class="Default"><span class="Apple-style-span" style="font-size: small;">Representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como una unidad léxica. Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el patrón para un componente léxico. </span></div><div class="Default"><span class="Apple-style-span" style="font-size: small;"><br />
</span></div><div class="Default"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Patrón </span></span></span></b><span style="font-size: 10.5pt;"></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;">Regla que describe el conjunto de lexemas que pueden representar a un determinado componente léxico en los programas fuente. En otras palabras, es la descripción del componente léxico mediante una regla</span></span><span lang="ES" style="font-size: 10.5pt;">. </span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES" style="font-size: 10.5pt;"><b><br />
</b></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES" style="font-size: 10.5pt;"><b><span class="Apple-style-span" style="color: #bf9000;">NOTA</span></b><span class="Apple-style-span" style="color: #bf9000;">:</span> <span class="Apple-style-span" style="font-size: small;">Cada palabra reservada del lenguaje representa un componente léxico diferente.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-size: small;"> </span></span></div><div class="Default"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Atributos de los componentes léxicos. </span></span></b><span style="font-size: 10.5pt;"></span></div><div class="Default">El analizador léxico recoge información sobre los componentes léxicos en sus atributos asociados. Los componentes léxicos influyen en las decisiones del análisis sintáctico y los atributos en la traducción de los componentes léxicos: </div><div class="Default"><br />
</div><div class="Default" style="margin-bottom: 6.95pt;"><span style="font-family: "Times New Roman", serif;">- </span>Apuntador a la entrada de la Tabla de símbolos donde se guarda la información sobre el componente léxico. </div><div class="Default" style="margin-bottom: 6.95pt;"><span style="font-family: "Times New Roman", serif;">- </span>El lexema para un identificador </div><div class="Default"><span style="font-family: "Times New Roman", serif;">- </span>El número de línea en que se encontró por primera vez. </div><br />
<b><span lang="ES"><span class="Apple-style-span" style="color: #3d85c6;"><span class="Apple-style-span" style="font-size: large;"> </span></span></span></b><br />
<div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="text-align: right;"><b><span lang="ES"><span class="Apple-style-span" style="color: #3d85c6;"><span class="Apple-style-span" style="font-size: large;">2.3 Manejo de buffers de entrada</span></span></span></b></div><div class="MsoNormal" style="text-align: right;"><b><span lang="ES"><span class="Apple-style-span" style="color: #3d85c6;"><span class="Apple-style-span" style="font-size: large;"> </span></span></span></b></div><div class="MsoNormal" style="text-align: left;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Código de preanálisis con centinelas </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero := delantero +1; </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">If </span></span></span></span><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero</span></span></span><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">▲ </span></span></span></i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">:= eof then begin</span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> If </span></span></span></span><i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero </span></span></span></span></i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">está al final de la primera mitad then begin </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">recargar la segunda mitad; </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero </span></span></span></span></i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">:= </span></span></span><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero </span></span></span></i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">+ 1 </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">end </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">else if </span></span></span></span><i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero </span></span></span></span></i><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">está al final de la segunda mitad then begin </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">recargar la primera mitad; </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">pasar </span></span></span><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">delantero </span></span></span></i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">al principio de la primera mitad </span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">end</span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> else</span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> </span></span></span></span><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">terminar el análisis léxico</span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> end</span></span></span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></span></span></span><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"> </span></span></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">N </span></span><span style="font-family: Wingdings;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">à </span></span></span><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">número de caracteres en un bloque de disco eof </span></span><span style="font-family: Wingdings;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">à </span></span></span><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">marca el final del archivo fuente Se mantienen dos apuntadores al buffer de entrada (Comienzo_lexema y Delantero) Al principio, los dos apuntadores apuntan al primer carácter del próximo lexema que hay que encontrar: </span></span></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="Default" style="margin-bottom: 6.95pt;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">1.<span class="Apple-style-span" style="color: #bf9000;"> El APUNTADOR DELANTERO</span> examina hacia delante hasta encontrar una concordancia con un patrón. Una vez determinado el siguiente lexema, el apuntador delantero se coloca en el carácter de su extremo derecho. </span></span></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">2. <span class="Apple-style-span" style="color: #bf9000;">El APUNTADOR DE LEXEMA</span> se queda al inicio del lexema y lo procesa. </span></span></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;">Después de haber procesado el lexema, ambos apuntadores se colocan en el carácter situado inmediatamente después del lexema. Con este esquema, los comentarios y espacios en blanco se consideran como patrones que no producen componentes léxicos.</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;">Cuando el </span><i><span class="Apple-style-span" style="font-weight: normal;">apuntador delantero </span></i><span class="Apple-style-span" style="font-weight: normal;">está a punto de sobrepasar por la marca intermedia del buffer, se llena la mitad derecha con N nuevos caracteres de entrada. Cuando el apuntador delantero está a punto de sobrepasar el extremo derecho del buffer, se llena la mitad requerida con N nuevos caracteres de entrada y el apuntador delantero se regresa al principio del buffer. </span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><br />
</span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"> </span><b><span lang="ES"><span class="Apple-style-span" style="color: #6aa84f;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Código para avanzar el apuntador delantero</span></span></span></b></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">(En Pascal) If </span><i><span class="Apple-style-span" style="font-weight: normal;">delantero </span></i><span class="Apple-style-span" style="font-weight: normal;">está al final de la primera mitad then begin</span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">recargar la segunda mitad; </span></span></div><div class="MsoNormal" style="text-align: right;"><i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">delantero </span></span></i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">:= </span><i><span class="Apple-style-span" style="font-weight: normal;">delantero </span></i><span class="Apple-style-span" style="font-weight: normal;">+ 1 </span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">end </span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">else if </span></span><i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">delantero </span></span></i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">está al final de la segunda mitad then begin </span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">recargar la primera mitad; </span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">pasar </span><i><span class="Apple-style-span" style="font-weight: normal;">delantero </span></i><span class="Apple-style-span" style="font-weight: normal;">al principio de la primera mitad </span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">end </span></span></div><div class="MsoNormal" style="text-align: right;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">else </span></span></div><div class="MsoNormal" style="text-align: right;"><i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">delantero </span></span></i><span lang="ES" style="font-size: 10.5pt;"><span class="Apple-style-span" style="font-weight: normal;">:= </span><i><span class="Apple-style-span" style="font-weight: normal;">delantero </span></i><span class="Apple-style-span" style="font-weight: normal;">+ 1</span></span></div><div class="MsoNormal" style="text-align: right;"><span lang="ES" style="font-size: 10.5pt;"><br />
</span></div><div class="MsoNormal" style="text-align: left;"><span lang="ES" style="font-size: 10.5pt;"></span></div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Técnica de “Centinelas” </span></span></span></span></b></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">Si se utiliza la pareja de buffers, cada vez que se mueva el apuntador delantero se debe comprobar si se ha salido de una mitad del buffer, si así ocurriera se deberá cargar la segunda mitad. Es decir, para hacer avanzar el apuntador se realizan dos pruebas. Se pueden reducir estas dos pruebas a una si se amplía cada mitad del buffer para admitir un carácter centinela (carácter especial que no puede ser parte del programa fuente – </span></span><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">eof</span></span><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-weight: normal;">) al final.</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotJfFc27fD0hmYaky5CwTvCgH9PNn3ctUpsCPxZWbWvrW1kJH-6gKqgUFK0DjKop4vo-iRWvvrrK22wVOJFEed14x9Jmrszu8xEU7zzUZuyWovuHVlQHF6Hm2gH0ifiFRdn_TS9cULFtU/s1600/imagen4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotJfFc27fD0hmYaky5CwTvCgH9PNn3ctUpsCPxZWbWvrW1kJH-6gKqgUFK0DjKop4vo-iRWvvrrK22wVOJFEed14x9Jmrszu8xEU7zzUZuyWovuHVlQHF6Hm2gH0ifiFRdn_TS9cULFtU/s400/imagen4.jpg" width="400" /></a></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">Buffer. Área del almacenamiento primario destinada a contener datos durante transferencia de entrada salida. Durante la entrada los datos son cargados en el buffer, al terminar la transferencia ya se puede trabajar con ellos. El analizador léxico es la única fase del compilador que lee el programa fuente carácter a carácter, por lo que es posible que se consuma mucho tiempo en la fase de análisis léxico, aunque las fases posteriores sean más complejas. La velocidad del análisis léxico supone un problema en el diseño de compiladores. Como se puede consumir mucho tiempo moviendo caracteres, se han desarrollado técnicas especializadas en el manejo de buffers para reducir el número de operaciones necesarias para procesar un caracter de entrada.</span></span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span></span><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;"><br />
</span></span></b></div><div class="Default"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Técnica de “Pareja de buffers” </span></span></b><span style="font-size: 10.5pt;"></span></div><div class="Default"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;"><br />
</span></span></b></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">En la técnica de <i>pareja de buffers </i>se utiliza un buffer dividido en dos mitades de N caracteres cada uno:</span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Kvdi3kmsgaYUim1m4LMZmHEtDpvDRlaBAzJ04TgI53JRAM42EtSJqVpiJwvvnygZPE8K2FpWH0co5qzHYX_rVC4MgG9W8veJz66CYuKZ-90toY4E54qBesYitoWmfovt_Qko-fmJxcXd/s1600/imagen3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Kvdi3kmsgaYUim1m4LMZmHEtDpvDRlaBAzJ04TgI53JRAM42EtSJqVpiJwvvnygZPE8K2FpWH0co5qzHYX_rVC4MgG9W8veJz66CYuKZ-90toY4E54qBesYitoWmfovt_Qko-fmJxcXd/s400/imagen3.jpg" width="400" /></a></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><br />
</span><b><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;"> </span></span></span></b></div><div class="MsoNormal" style="text-align: right;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;">2.4 Especificación de los componentes léxicos</span></span></span></b></div><div class="MsoNormal" style="text-align: right;"><span class="Apple-style-span" style="color: #6aa84f; font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="color: #3d85c6; font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="font-size: large;"> </span></span></span></span></div><b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"><div class="Default"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Expresiones regulares </span></span></span><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"></span></span></span></i></div><div class="Default"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-style: normal;"><span class="Apple-style-span" style="font-size: small;">Notación o representación para especificar patrones para un componente léxico. Cada patrón concuerda con una serie de cadenas, de modo que las expresiones regulares servirán como nombres para conjuntos de cadenas</span></span><span class="Apple-style-span" style="font-size: small;">.</span></span></span></i></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<i><span class="Apple-style-span" style="color: black;"><b><b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #3d85c6;"></span></span></b></b></span></i></div><i><span class="Apple-style-span" style="color: black;"><b><b><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #3d85c6;"><div class="Default" style="margin-bottom: 0.5pt;"><br />
<div class="MsoNormal" style="text-align: justify;"><b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"></span></b><br />
<b><span class="Apple-style-span" style="color: #3d85c6;"><div class="Default" style="margin: 0px;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;">Cadenas y lenguajes</span></span></span><span style="font-size: 10.5pt;"><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"></span></span></i></span></div><div class="Default" style="margin: 0px;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #6aa84f;"><br />
</span></span></span></div><div class="MsoNormal" style="margin: 0px; text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-style: normal;">Alfabeto o clase de carácter. </span></span></span></span></span><span lang="ES"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-style: normal;">Denota cualquier conjunto finito de símbolos (letras o caracteres). Conjunto {0,1} alfabeto binario a, b, c, d, e, ... , z alfabeto Código ASCII, EBCDIC alfabetos del computador Cadena (frase o palabra). Es una secuencia finita de símbolos tomadas de un alfabeto. Lenguaje. Se refiere a cualquier conjunto de cadenas de un alfabeto fijo. Por ejemplo, todas las palabras u oraciones en español, todas las palabras reservadas o instrucciones del lenguaje C.</span></span></span></span></span></div><div class="MsoNormal" style="margin: 0px; text-align: justify;"><span lang="ES" style="font-size: 10.5pt;"><i><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: black;"> </span></span></i></span></div></span><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></b><br />
<div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></span><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></span><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></b><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></b><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></span><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"></div></div></div></i><div class="Default" style="margin-bottom: 0.5pt;"><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="margin: 0px; text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="color: #6aa84f;">Operaciones aplicadas a lenguajes </span></span><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="color: #6aa84f;">Para el análisis léxico, consideramos principalmente: </span></span></div></div></div><div class="Default"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="color: #6aa84f;"><br />
</span></span></div><div class="Default" style="margin-bottom: 6.9pt;"><span style="font-family: "Times New Roman", serif;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">- </span></span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">unión </span></span></span></div><div class="Default" style="margin-bottom: 6.9pt;"><span style="font-family: "Times New Roman", serif;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">- </span></span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">concatenación </span></span></span></div><div class="Default"><span style="font-family: "Times New Roman", serif;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">- </span></span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">cerradura </span></span><span class="Apple-style-span" style="font-size: small;"></span></span></div><div class="Default"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;">También se puede extender el operador de “exponenciación” a los lenguajes definiendo L° como { }</span></span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0UswkUXNnO5FXdTSsgUHFOR-OlhVBpoZ-7EhO-4Xvf1WpHckohAUg6vhWHb4HV-pZ8rrt1IlELMyZWGDOln2ZOJDeyO-E_oUdVdJ1FJBEFI7wHGrBRbjMJP4nokfUkHhY12-uf-H31y29/s1600/imagen5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="71" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0UswkUXNnO5FXdTSsgUHFOR-OlhVBpoZ-7EhO-4Xvf1WpHckohAUg6vhWHb4HV-pZ8rrt1IlELMyZWGDOln2ZOJDeyO-E_oUdVdJ1FJBEFI7wHGrBRbjMJP4nokfUkHhY12-uf-H31y29/s400/imagen5.jpg" width="400" /></a></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></span></span></div></span></b><span lang="ES">Sea <b>L </b>el conjunto {A, B, C, D, ...,Z, a, b, c, d,...,z} y <b>D </b>el conjunto {0, 1, 2, ..., 9}. Algunos ejemplos de nuevos lenguajes creados a partir de L y D: </span></div><div class="MsoNormal" style="text-align: justify;"><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">1. LUD es el conjunto de letras y dígitos. </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">2. LD es el conjunto de cadenas que consta de una letra seguida de un dígito. </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">3. L<sup><span class="Apple-style-span" style="font-size: small;">4</span></sup></span><span lang="ES"> </span><span lang="ES">es el conjunto de todas las cadenas de cuatro letras. </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">4. L* es el conjunto de todas las cadenas de letras, incluyendo la cadena vacía ( ). </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">5. L(LUD)* es el conjunto de todas las cadenas de letras y dígitos que comienzan con una letra. </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">6. D</span><sup><span lang="ES"><span class="Apple-style-span" style="font-size: small;">+</span></span></sup><span lang="ES"> </span><span lang="ES">es el conjunto de todas las cadenas de uno o más dígitos.</span></div></div></div><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #6aa84f;">Abreviaturas en la notación</span></span></span></b></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"> </span></b><span lang="ES">1. Uno<span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> o más casos de. + </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">2. Cero o un caso. ? </span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Por ejemplo, usando los operadores + y ? se puede reescribir la definición regular para num:</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">digito </span><span lang="ES" style="font-family: Wingdings;">à </span><span lang="ES">0|1|2|3|...|9 </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">digitos </span><span lang="ES" style="font-family: Wingdings;">à </span><span lang="ES">digito </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">fraccion_optativa </span><span lang="ES" style="font-family: Wingdings;">à </span><span lang="ES">(.digitos)? </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">exponente_optativo </span><span lang="ES" style="font-family: Wingdings;">à </span><span lang="ES">(E(+|-)? digitos)? </span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES">num </span><span lang="ES" style="font-family: Wingdings;">à </span><span lang="ES">digitos fraccion_optativa exponente_optativo</span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">3. Cero o más casos. *</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> 4. Clases de caracteres. Notación abreviada para las expresiones regulares.</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><b><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #6aa84f;">Conjuntos no regulares</span></span></span></b></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;">Aquellos lenguajes que no se pueden describir con ninguna expresión regular.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> </span></span><span lang="ES" style="font-size: 12pt;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> </span></span><span lang="ES" style="font-size: 12pt;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> </span></span><span lang="ES" style="font-size: 12pt;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"> </span></span><b><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;"><br />
</span></span></span></b></div><div class="MsoNormal" style="text-align: right;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;">2.5 Reconocimiento de los componentes léxicos</span></span></span></b></div><div class="MsoNormal" style="text-align: right;"><b><span lang="ES"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="color: #3d85c6;"><br />
</span></span></span></b><b><span lang="ES" style="font-family: Arial, sans-serif;"><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><span class="Apple-style-span" style="color: #3d85c6;"><span class="Apple-style-span" style="color: black; font-size: medium;"><span class="Apple-style-span" style="font-size: 16px; font-weight: normal;"> </span></span></span></span></span></span></b></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">Consideremos el siguiente formato gramatical: </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><i><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">prop </span></span></span></i><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">if </span></span></span><i><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">expr prop </span></span></span></i></div><div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><i><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span></i><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">| </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">if </span></span><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">expr prop </span></span></i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">else </span></span><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">prop </span></span></i></span></div><div class="MsoNormal" style="margin-left: 35.4pt; text-align: justify;"><i><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span></i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">| €</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">expr </span></span></i><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">termino </span></span></i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">op_rel </span></span><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">termino </span></span></i></div><div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">| </span></span><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">termino</span></span></i></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><i><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">termino </span></span></i><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">id </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">| </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">num</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">*Donde if, else, opr_rel, id, num, generan conjuntos de cadenas dadas por la siguiente definición regular:</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">If </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">if</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">else </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">else </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">op_rel</span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">< | <= | == | >= | > | < > </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">id </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">letra (letra|digito)* num </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">digitos fraccion_optativa exponente_optativo </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">letra </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">a|b|c|d| ... |z|A|B|C|...|Z </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">digito </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">0|1|2|3|...|9 </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">digitos </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">digito digito*</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> fraccion_optativa </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">.digitos|€ </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">exponente_optativo </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">(E(+|-|€) digitos)|€</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">* El analizador léxico reconoce las palabras clave del lenguaje (if, else)</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">* op_rel, id, num, los representa por su expresión regular.</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">Se supone que los lexemas están separados por espacios en blanco, formados por secuencias nulas de espacios en blanco, caracteres TAB y caracteres de nueva línea.</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> El analizador léxico eliminará los espacios en blanco. Esto lo hará comparando una cadena con la definición de la expresión regular </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">eb </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">siguiente:</span></span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">delim </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">blanco | TAB | linea_nueva </span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">eb </span></span></span><span lang="ES" style="font-family: Wingdings;"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">à </span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">delim</span></span></span><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">+</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></span></span></div><div class="MsoNormal" style="text-align: justify;"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">Si se encuentra una concordancia para </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">eb </span></span><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;">(espacio en blanco), el analizador léxico no devuelve un componente léxico al analizador sintáctico, sino que se dispone a encontrar un componente léxico a continuación del espacio en blanco y lo devuelve al analizador sintáctico.</span></span></span></div><div class="MsoNormal"></div><div class="MsoNormal"><span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"> </span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"></span></span></span><br />
<span lang="ES"><span class="Apple-style-span" style="color: black;"><span class="Apple-style-span" style="font-weight: normal;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><b style="mso-bidi-font-weight: normal;"><i><span lang="ES" style="color: #3d85c6; font-family: "Georgia","serif"; font-size: 18pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2.6 Autómatas finitos<o:p></o:p></span></i></b></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><br />
</div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Un autómata finito es un conjunto de nodos y aristas que representan trayectorias para generar una expresión bajo un alfabeto. Un diagrama de transición es un autómata finito.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">La finalidad de los autómatas finitos es la de reconocer lenguajes regulares, que corresponden a los lenguajes formales más simples según la Jerarquía de Chomsky.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">El origen de los autómatas finitos probablemente se remonta a su uso implícito en máquinas electromecánicas, desde principios del siglo XX.1 Ya en 1907, el matemático ruso Andréi Márkov formalizó un proceso llamado cadena de Markov, donde la ocurrencia de cada evento depende con una cierta probabilidad del evento anterior.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Esta capacidad de "recordar" es utilizada posteriormente por los autómatas finitos, que poseen una memoria primitiva similar, en que la activación de un estado también depende del estado anterior, así como del símbolo o palabra presente en la función de transición.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Posteriormente, en 1943, surge una primera aproximación formal de los autómatas finitos con el modelo neuronal de McCulloch-Pitts. Durante la década de 1950 prolifera su estudio, frecuentemente llamándoseles máquinas de secuencia; se establecen muchas de sus propiedades básicas, incluyendo su interpretación como lenguajes regulares y su equivalencia con las expresiones regulares.1 Al final de esta década, en 1959, surge el concepto de autómata finito no determinista en manos de los informáticos teóricos Michael O. Rabin y Dana Scott.3<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">En la década de 1960 se establece su conexión con las series de potencias y los sistemas de sobreescritura.4 Finalmente, con el desarrollo del sistema operativo Unix en la década de 1970, los autómatas finitos encuentran su nicho en el uso masivo de expresiones regulares para fines prácticos, específicamente en el diseño de analizadores léxicos (comando lex) y la búsqueda y reemplazo de texto (comandos ed y grep). A partir de ese tiempo, los autómatas finitos también se comienzan a utilizar en sistemas dinámicos.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Este autómata finito está definido sobre el alfabeto Σ={0,1}, posee dos estados s1 y s2, y sus transiciones son δ(s1,0)=s2, δ(s1,1)=s1, δ(s2,0)=s1 y δ(s2,1)=s2. Su estado inicial es s1, que es también su único estado final. El lenguaje regular que reconoce puede expresarse mediante la expresión regular (00 | 11 | (01 | 10)(01 | 10)) * .<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Los autómatas finitos se pueden representar mediante grafos particulares, también llamados diagramas de estados finitos, de la siguiente manera:<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">• Los estados se representan como vértices, etiquetados con su nombre en el interior.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">• Una transición desde un estado a otro, dependiente de un símbolo del alfabeto, se representa mediante una arista dirigida que une a estos vértices, y que está etiquetada con dicho símbolo.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">• El estado inicial se caracteriza por tener una arista que llega a él, proveniente de ningún otro vértice.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">• El o los estados finales se representan mediante vértices que están encerrados a su vez por otra circunferencia.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p> </o:p></span><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Otra manera de describir el funcionamiento de un autómata finito es mediante el uso de tablas de transiciones o matrices de estados. Dos posibles tablas para el ejemplo de la imagen anterior podrían ser las siguientes:<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br />
</div><table border="0" cellpadding="0" class="MsoNormalTable" style="mso-cellspacing: 1.5pt; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-yfti-tbllook: 1184;"><tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"> <td style="background-color: transparent; border: rgb(0, 0, 0); padding: 0.75pt;"><table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="background: rgb(249, 249, 249); border-collapse: collapse; border: currentColor; margin: auto auto auto 12pt; mso-border-alt: solid #AAAAAA .75pt; mso-padding-alt: 6.0pt 6.0pt 6.0pt 6.0pt; mso-yfti-tbllook: 1184;"><tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"> <td style="background: rgb(242, 242, 242); border: 1pt solid rgb(170, 170, 170); mso-border-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">salida<br />
<i>q</i> </span><span style="font-family: "Cambria Math","serif"; font-size: 12pt; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> Q<o:p></o:p></span></div></td> <td style="background: rgb(242, 242, 242); border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: solid solid solid none; border-width: 1pt 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">símbolo<br />
σ </span><span style="font-family: "Cambria Math","serif"; font-size: 12pt; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> Σ<o:p></o:p></span></div></td> <td style="background: rgb(242, 242, 242); border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: solid solid solid none; border-width: 1pt 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">llegada<br />
δ(<i>q</i>,σ) </span><span style="font-family: "Cambria Math","serif"; font-size: 12pt; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> Q<o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 1;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">0<o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 2;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1<o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 3;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">0<o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 4; mso-yfti-lastrow: yes;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1<o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
</tbody></table></td> <td style="background-color: transparent; border: rgb(0, 0, 0); padding: 0.75pt;"><table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="background: rgb(249, 249, 249); border-collapse: collapse; border: currentColor; margin: auto auto auto 12pt; mso-border-alt: solid #AAAAAA .75pt; mso-padding-alt: 6.0pt 6.0pt 6.0pt 6.0pt; mso-yfti-tbllook: 1184;"><tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"> <td style="background: rgb(242, 242, 242); border: 1pt solid rgb(170, 170, 170); mso-border-alt: solid #AAAAAA .75pt; padding: 2.4pt;"></td> <td style="background: rgb(242, 242, 242); border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: solid solid solid none; border-width: 1pt 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">0<o:p></o:p></span></div></td> <td style="background: rgb(242, 242, 242); border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: solid solid solid none; border-width: 1pt 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="center" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: center;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1<o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 1;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">→</span><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">*<i>s</i><sub>1</sub><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
<tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes;"> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170); border-style: none solid solid; border-width: 0px 1pt 1pt; mso-border-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">1</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> <td style="border-color: rgb(0, 0, 0) rgb(170, 170, 170) rgb(170, 170, 170) rgb(0, 0, 0); border-style: none solid solid none; border-width: 0px 1pt 1pt 0px; mso-border-alt: solid #AAAAAA .75pt; mso-border-left-alt: solid #AAAAAA .75pt; mso-border-top-alt: solid #AAAAAA .75pt; padding: 2.4pt;"><div align="right" class="MsoNormal" style="line-height: normal; margin: 12pt 0cm; text-align: right;"><i><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">s</span></i><sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2</span></sub><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div></td> </tr>
</tbody></table><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 12pt;"><span lang="ES" style="font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><br />
<br style="mso-special-character: line-break;" /> <br style="mso-special-character: line-break;" /> <o:p></o:p></span></div></td> </tr>
</tbody></table><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">La primera representa explícitamente los parámetros y el valor que toma cada ocurrencia de la función de transición. La segunda es más compacta, y marca con una flecha el estado inicial, y con un asterisco los estados finales.<o:p></o:p></span></div><br />
<br />
<div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><span lang="ES" style="color: #3d85c6; font-family: "Georgia","serif"; font-size: 18pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2.7 AUTOMATAS FINITOS NO DETERMINISTICOS</span><span style="color: black; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><span style="color: black; font-size: 12pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"></span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><a href="http://es.wikipedia.org/wiki/Aut%C3%B3mata_finito_determinista" title="Autómata finito determinista"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">AFD</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> que reconoce el </span><a href="http://es.wikipedia.org/wiki/Lenguaje_regular" title="Lenguaje regular"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">lenguaje regular</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> conformado exclusivamente por las cadenas con un número par de ceros y par de unos.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 1.2pt; text-align: justify;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Un <b>autómata finito determinista</b> (abreviado <b>AFD</b>) es un autómata finito que además es un </span><a href="http://es.wikipedia.org/wiki/Sistema_determinista" title="Sistema determinista"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">sistema determinista</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">; es<span style="color: black;"> decir, para cada estado <i>q</i> </span></span><span lang="ES" style="color: black; font-family: "Cambria Math","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> <i>Q</i> en que se encuentre el autómata, y con cualquier símbolo <i>a</i> </span><span lang="ES" style="color: black; font-family: "Cambria Math","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> Σ del alfabeto leído, existe siempre a lo más una transición posible δ(<i>q</i>,<i>a</i>).<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">En un AFD no pueden darse ninguno de estos dos casos:<o:p></o:p></span></div><br />
<ul type="disc"><li class="MsoNormal" style="color: black; line-height: normal; margin: 0cm 0cm 10pt; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; text-autospace: ideograph-numeric;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Que existan dos transiciones del tipo δ(<i>q</i>,<i>a</i>)=<i>q</i><sub>1</sub> y δ(<i>q</i>,<i>a</i>)=<i>q</i><sub>2</sub>, siendo <i>q</i><sub>1</sub> ≠ <i>q</i><sub>2</sub>;<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; line-height: normal; margin: 0cm 0cm 10pt; mso-list: l0 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; text-autospace: ideograph-numeric;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Que existan transiciones del tipo δ(<i>q</i>,</span><span style="color: windowtext;"><a href="http://es.wikipedia.org/wiki/Cadena_vac%C3%ADa" title="Cadena vacía"><span lang="ES" style="color: blue; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">ε</span></a></span><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">), salvo que <i>q</i> sea un estado final, sin transiciones hacia otros estados.<o:p></o:p></span></li>
</ul><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Un ejemplo interesante de autómatas finitos deterministas son los </span><a href="http://es.wikipedia.org/wiki/Trie" title="Trie"><span lang="ES" style="color: blue; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">tries</span></a><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">.</span><span lang="ES" style="color: black; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><a href="http://es.wikipedia.org/wiki/Aut%C3%B3mata_finito_no_determinista" title="Autómata finito no determinista"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">AFND</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> con transiciones δ(<i>q</i><sub>0</sub>,<i>b</i>)=<i>q</i><sub>0</sub> y δ(<i>q</i><sub>0</sub>,<i>b</i>)=<i>q</i><sub>1</sub>, que acepta el </span><a href="http://es.wikipedia.org/wiki/Lenguaje_regular" title="Lenguaje regular"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">lenguaje regular</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> sobre el alfabeto {<i>a</i>,<i>b</i>} conformado por todas las palabras que terminan en <i>b</i>; es decir, que equivale a la </span><a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular" title="Expresión regular"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">expresión regular</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> (a|b)*b<sup>+</sup>.</span><span lang="ES" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"></span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><a href="http://es.wikipedia.org/wiki/Aut%C3%B3mata_finito_no_determinista" title="Autómata finito no determinista"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">AFND-ε</span></a><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> a cuyo estado 2 se puede acceder pasando por el estado 3, sin procesar símbolos de entrada.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Un <b>autómata finito no determinista</b> (abreviado <b>AFND</b>) es aquel que, a diferencia de los autómatas finitos deterministas, posee al menos un estado <i>q</i> </span><span lang="ES" style="color: black; font-family: "Cambria Math","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> <i>Q</i>, tal que para un símbolo <i>a</i> </span><span lang="ES" style="color: black; font-family: "Cambria Math","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Cambria Math"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">∈</span><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> Σ del alfabeto, existe más de una transición δ(<i>q</i>,<i>a</i>) posible.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Haciendo la analogía con los AFDs, en un AFND puede darse cualquiera de estos dos casos:<o:p></o:p></span></div><br />
<ul type="disc"><li class="MsoNormal" style="color: black; line-height: normal; margin: 0cm 0cm 10pt; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; text-autospace: ideograph-numeric;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Que existan transiciones del tipo δ(<i>q</i>,<i>a</i>)=<i>q</i><sub>1</sub> y δ(<i>q</i>,<i>a</i>)=<i>q</i><sub>2</sub>, siendo <i>q</i><sub>1</sub> ≠ <i>q</i><sub>2</sub>;<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; line-height: normal; margin: 0cm 0cm 10pt; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-align: justify; text-autospace: ideograph-numeric;"><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Que existan transiciones del tipo δ(<i>q</i>,</span><span style="color: windowtext;"><a href="http://es.wikipedia.org/wiki/Cadena_vac%C3%ADa" title="Cadena vacía"><span lang="ES" style="color: blue; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">ε</span></a></span><span lang="ES" style="font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">), siendo <i>q</i> un estado no-final, o bien un estado final pero con transiciones hacia otros estados.<o:p></o:p></span></li>
</ul><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Cuando se cumple el segundo caso, se dice que el autómata es un <b>autómata finito no determinista con transiciones vacías</b> o <b>transiciones ε</b> (abreviado <b>AFND-ε</b>). Estas transiciones permiten al autómata cambiar de estado sin procesar ningún símbolo de entrada.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Formalmente, se distingue de la 5-tupla que define a un autómata finito determinista en su </span><a href="http://es.wikipedia.org/wiki/Funci%C3%B3n_de_transici%C3%B3n" title="Función de transición"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">función de transición</span></a><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">. Mientras en un AFD esta función se define de la siguiente manera:</span><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p> </o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">En un AFND se define como:<o:p></o:p></span></div><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Para el caso de los AFND-ε, se suele expresar la función de transición de la forma:<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Donde <i>P(Q)</i> es el </span><a href="http://es.wikipedia.org/wiki/Conjunto_potencia" title="Conjunto potencia"><span lang="ES" style="color: windowtext; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX; text-decoration: none; text-underline: none;">conjunto potencia</span></a><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> de <i>Q</i>.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Esto significa que los autómatas finitos deterministas son un caso particular de los no deterministas, puesto que <i>Q</i> pertenece al conjunto <i>P(Q)</i>.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">La interpretación que se suele hacer en el cómputo de un AFND es que el autómata puede estar en varios estados a la vez, generándose una ramificación de las <i>configuraciones</i> existentes en un momento dado. Otra interpretación puede ser imaginar que la máquina "adivina" a qué estado debe ir, eligiendo una transición entre varias posibles.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Note finalmente que en un autómata finito no determinista podemos aceptar la existencia de más de un nodo inicial, relajando aún más la definición original</span><span lang="ES" style="color: black; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">.<o:p></o:p></span></div><br />
<div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><b style="mso-bidi-font-weight: normal;"><i><span lang="ES" style="color: #3d85c6; font-family: "Arial","sans-serif"; font-size: 18pt; mso-ansi-language: ES; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">2.8 AUTOMATAS FINITOS DETERMINISTICOS</span></i></b><span lang="ES" style="color: black; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Un DFA es un caso especial de NFA en el que ningún estado tiene transiciones para diversos estados bajo el mismo símbolo y no se permiten transiciones épsilon. Los diagramas de transición son autómatas determinísticos. Por ejemplo, el DFA de (a | b)* a b b puede ser:</span><span lang="ES" style="color: #3d85c6; font-family: "Arial","sans-serif"; font-size: 18pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">que podría ser muy aproximado al diagrama de transición que construiríamos para la expresión.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Para llegar de la expresión regular al autómata determinístico se emplea el método de</span><span lang="ES" style="color: blue; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> </span><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Thompson que permite hacerla transformación y preparar la construcción del analizador de léxico.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Que podría ser muy aproximado al diagrama de transición que construiríamos para la expresión.<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">Para llegar de la expresión regular al autómata determinístico se emplea el </span><a href="http://webdia.cem.itesm.mx/ac/aesparza/compi/thompson.html"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">método de Thompson</span></a><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"> que permite hacerla transformación y preparar la construcción del analizador de léxico.</span><span lang="ES" style="color: #3d85c6; font-family: "Arial","sans-serif"; font-size: 18pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"><o:p></o:p></span></div><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/pk17OhAoAOM?feature=player_embedded' frameborder='0'></iframe></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;"></span></div><div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><b style="mso-bidi-font-weight: normal;"><span lang="ES" style="color: #3d85c6; font-family: "Georgia","serif"; font-size: 18pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;">2.9 PASO DE UNA EXPRESIÓN REGULAR A UN AFN</span></b><span lang="ES" style="color: black; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;"><o:p></o:p></span></div><br />
<br />
<div align="center" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: center;"><b><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-size: 9.0pt; mso-bidi-font-style: italic; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;">NOTA: Link del libro” COMPILADORES. PRINCIPIOS TECNICAS Y HERRAMIENTAS” </span></b><span lang="ES" style="color: black; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;">en donde encontrarán todos los temas que hemos visto en clase y los que están mostrados en este blog<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><br />
<div align="center" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2; text-align: center;"><a href="http://www.intercambiosvirtuales.org/libros-manuales/compiladores-principios-tecnicas-y-herramientas-pearson-educacion"><b><span lang="ES" style="color: blue; font-family: "Times New Roman","serif"; font-size: 18pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES-MX;">http://www.intercambiosvirtuales.org/libros-manuales/compiladores-principios-tecnicas-y-herramientas-pearson-educacion</span></b></a><span lang="ES" style="color: #3d85c6; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;"><o:p></o:p></span></div><br />
<div align="center" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2; text-align: center;"><br />
</div><br />
<div align="right" class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; text-align: right;"><b><span lang="ES" style="color: black; font-family: "Georgia","serif"; font-size: 18pt; mso-ansi-language: ES; mso-bidi-font-family: Arial; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;">2.10 DISEÑO DE UN GENERADOR DE ANALIZADORES LÉXICOS</span></b><b><i><span lang="ES" style="color: black; font-family: "Arial","sans-serif"; font-size: 12pt; mso-ansi-language: ES; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;"> </span></i></b><span lang="ES" style="color: #3d85c6; font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: ES; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;"><o:p></o:p></span></div><br />
<a href="https://dl-web.dropbox.com/get/Beltrán%20Cortés%20Irving%20Giovanni/Analisis%20Lexico/compilador.rar?w=59df9cf6"><span style="font-size: large;">Programa de Análisis Léxico en C++</span></a></span></span></span><span class="Apple-style-span" style="color: black; font-family: "Times New Roman";"><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="color: #3d85c6;"><span class="Apple-style-span"><br />
<span style="font-size: large;"> </span></span></span></span></span></div><div class="MsoNormal"><div style="text-align: center;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="color: #b45f06;">Si te interesa conocer más sobre el análisis léxico consulta los siguientes documentos:</span></span></div><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><br />
</span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span class="Apple-style-span" style="font-family: Georgia, "Times New Roman", serif;"><b><span class="Apple-style-span" style="color: #3d85c6;"></span></b></span></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><b><span class="Apple-style-span" style="color: #3d85c6;"></span></b></span><br />
<div class="MsoNormal"><div style="margin: 0px;"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span class="Apple-style-span" style="font-size: large;"><a href="http://protos.dis.ulpgc.es/docencia/seminarios/rit/Analisis_lexico/index.htm">Página Web interactiva sobre Análisis Léxico</a></span></span></div><div style="margin: 0px;"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span class="Apple-style-span" style="font-size: large;"><a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/Analisis%20Lexico.pdf?w=60e50e55">Documento 1 de Análisis Léxico</a></span></span></div><div style="margin: 0px;"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span class="Apple-style-span" style="font-size: large;"><a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/Analisis%20Lexico2.pdf?w=c2917dc8">Documento 2 de Análisis Léxico</a></span></span></div><div style="margin: 0px;"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman";"><span class="Apple-style-span" style="font-weight: normal;"><a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/Analisis%20Lexico4.pdf?w=59c31f78"><span class="Apple-style-span" style="font-size: large;">Documento 3 de Análisis Léxico</span></a></span></span></div><div style="margin: 0px;"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span class="Apple-style-span" style="font-size: large;"><a href="https://dl-web.dropbox.com/get/Beltr%C3%A1n%20Cort%C3%A9s%20Irving%20Giovanni/Analisis%20Lexico/Analisis%20Lexico3.pdf?w=3515498d">Presentación de Análisis Léxico</a></span></span></div><div style="margin: 0px;"></div><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span></div><div class="MsoNormal"><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"></span><br />
<span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: right;"></div><div style="margin: 0px;"><div align="left" style="text-align: right;"></div><div style="text-align: right;"></div></div></span><span class="Apple-style-span" style="color: black; font-family: "Times New Roman"; font-weight: normal;"><span lang="ES" style="font-family: "Arial", "sans-serif"; mso-bidi-font-size: 9.0pt;"><span style="font-family: Georgia, "Times New Roman", serif;"><span lang="ES" style="font-size: 12pt; mso-fareast-language: ES-MX;"></span></span> </span></span> </div></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com0tag:blogger.com,1999:blog-6282817495601970990.post-9664020189222136252011-05-18T09:05:00.000-05:002011-05-18T09:05:28.701-05:00UNIDAD 3: ANALISIS SINTÁCTICO<div style="text-align: justify;"><br />
<a name='more'></a><div style="text-align: center;"><span style="color: red; font-family: Verdana, sans-serif; font-size: x-large;">ANALISIS SINTÁCTICO</span><br />
<strong><span style="font-family: Georgia;">(Los apuntes son cortesía de la Maestra Theira Irasema Samperio Monroy)</span></strong></div><div style="text-align: center;"><br />
</div><span style="font-family: Georgia, "Times New Roman", serif;">Un <b>analizador sintáctico</b> (en inglés <i>parser</i>) es una de las partes de un compilador que transforma su entrada en un árbol de derivación.</span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div style="text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;">El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo un árbol de análisis o árboles de sintaxis abstracta.</span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div style="text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;">El análisis sintáctico también es un estado inicial del análisis de frases de lenguaje natural. Es usado para generar diagramas de lenguajes que usan flexión gramatical, como los idiomas romances o el latín. Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto. Cabe notar que existe una justificación formal que establece que los lenguajes libres de contexto son aquellos reconocibles por un autómata de pila, de modo que todo analizador sintáctico que reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un autómata de pila.</span></div><div style="text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><div style="text-align: right;"><br />
<span style="color: blue; font-size: large;"> </span></div></span><br />
<div style="text-align: right;"><span style="font-size: large;"><span style="color: blue;"><span style="font-family: Georgia, "Times New Roman", serif;"> </span><b style="mso-bidi-font-weight: normal;"><span style="font-family: Georgia, "Times New Roman", serif; font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 10.5pt;">3.1 Función del análisis sintáctico</span></b></span></span><b style="mso-bidi-font-weight: normal;"><span style="font-variant: small-caps; line-height: 115%;"><o:p></o:p></span></b></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%;">En el modelo del compilador, el analizador sintáctico obtiene una cadena de componentes léxicos del analizador léxico, y comprueba si la cadena puede ser generada por la gramática del programa fuente. Esta iteracción se esquematiza como sigue:</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcJCdjz5cbMB7DRvdCWTpzvWdhQnfOLLTkJt6q-ri-V9rJYjEKIQkspVDtk-Vlchr2ncYOQcsptXqKhixOkeGwLW3Z-M1GKYM47FOO_1Ra5Ghbr6PmENaBO4xhTMC5BvggHgmUv1yyjkR_/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Georgia, "Times New Roman", serif;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcJCdjz5cbMB7DRvdCWTpzvWdhQnfOLLTkJt6q-ri-V9rJYjEKIQkspVDtk-Vlchr2ncYOQcsptXqKhixOkeGwLW3Z-M1GKYM47FOO_1Ra5Ghbr6PmENaBO4xhTMC5BvggHgmUv1yyjkR_/s400/1.png" width="400" /></span></a></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Existen 2 tipos generales de analizadores sintácticos para gramáticas: <o:p></o:p></span></span></b></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">a) Análisis sintáctico descendente. Construye árboles de análisis sintáctico desde arriba (raíz) hacia abajo (hojas). El análisis se realiza de lo general a lo particular. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">b) Análisis sintáctico ascendente. Construyen árboles de análisis sintáctico comenzando en las hojas y suben hacia la raíz. El análisis se realiza de lo particular a lo general. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QpkSZbGtolL-Eeg9CH6dx2pTKMLYBYM211t48_uNdzZ2qlsS2EerSpnLK8IDmZlSUFs6qKqtz0qtyEKsrUs6u4Hjap0pIUxc2I9ZLwRPcIuQLMP6I6lZE1snutjG8-aQgEeW4SaG6xuT/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Georgia, "Times New Roman", serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QpkSZbGtolL-Eeg9CH6dx2pTKMLYBYM211t48_uNdzZ2qlsS2EerSpnLK8IDmZlSUFs6qKqtz0qtyEKsrUs6u4Hjap0pIUxc2I9ZLwRPcIuQLMP6I6lZE1snutjG8-aQgEeW4SaG6xuT/s1600/2.png" /></span></a></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">En ambos casos, se examina la entrada al analizador léxico de izquierda a derecha, un símbolo a la vez. La salida del analizador sintáctico es una representación del árbol de análisis sintáctico para la cadena de componentes léxicos producida por el analizador léxico. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div style="text-align: right;"><b style="mso-bidi-font-weight: normal;"><span style="color: blue; font-family: Georgia, "Times New Roman", serif; font-size: large; font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 11.0pt;">3.2 Gramáticas independientes de contexto </span><span style="font-variant: small-caps;"><o:p></o:p></span></b></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Se puede describir la sintaxis de las construcciones de los lenguajes de programación por medio de gramáticas independientes de contexto. Una gramática describe de forma natural la estructura jerárquica de muchas construcciones de los lenguajes de programación. <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Consta de: <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">•<b style="mso-bidi-font-weight: normal;">TERMINALES.</b> Símbolos básicos con que se forman las cadenas. Para un lenguaje de programación, cada palabra clave/reservada es un terminal. p<i>rop_if → </i>if <i>expr prop </i>else <i>prop <o:p></o:p></i></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">•<b style="mso-bidi-font-weight: normal;">NO TERMINALES</b>. Son variables sintácticas que denotan conjuntos de cadenas (identificadotes o variables). Los no terminales definen conjuntos de cadenas que ayudan a definir el lenguaje generado por la gramática. Imponen una estructura jerárquica sobre el lenguaje que es útil tanto para el análisis sintáctico como para la traducción. <i>prop_if expr prop </i>son no terminales <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">•<b style="mso-bidi-font-weight: normal;">UN SÍMBOLO INICIAL</b>. En una gramática, es un no terminal que representa un conjunto de cadenas. <i>prop_if </i>no terminal, símbolo inicial <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">•<b style="mso-bidi-font-weight: normal;">PRODUCCIONES</b>. Especifican cómo se pueden combinar los terminales y no terminales para formar cadenas. Cada producción consta de un No terminal (símbolo inicial), seguido por una flecha o símbolo de asignación, seguida por una cadena de no terminales y terminales. <i>prop_if → </i>if <i>expr prop </i>else <i>prop </i>Por ejemplo, la gramática con las siguientes producciones define expresiones aritméticas simples: <i>expr → expr </i>op <i>expr expr → (expr) expr → - expr expr → </i>id <i>Op → </i>+ <i>Op → - Op → / Op → </i>* <i>Op → % <o:p></o:p></i></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div style="text-align: right;"><b style="mso-bidi-font-weight: normal;"><span style="font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 11.0pt;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="color: blue;"><span style="font-size: large;">3.3 Escritura de una gramática <o:p></o:p></span></span></span></span></b></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><span style="font-family: Georgia, "Times New Roman", serif;">Las gramáticas describen la mayoría de las sintaxis de los lenguajes de programación. Toda construcción que se pueda describir mediante una expresión regular también se puede describir por medio de una gramática. Por ejemplo, para la expresión regular (a|b)* abb Y la gramática: A0 <i>→ </i>a A0 | b A0| b A1 A1 <i>→ </i>b A2 <o:p></o:p></span><br />
<span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%;">A2 <i>→ </i>bA3 A3 <i>→ </i>є Describen el mismo lenguaje: el conjunto de cadenas de caracteres a y b que terminan en abb. </span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Todo conjunto regular es un lenguaje independiente de contexto, ¿porqué utilizar expresiones regulares para definir la sintaxis léxica de un lenguaje? Razones para utilizar expresiones regulares para definir la sintaxis léxica de un lenguaje. <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Las reglas lexicogáficas de un lenguaje a menudo son bastante sencillas, y para describirlas no se necesita una notación tan poderosa como las gramáticas. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Proporcionan una notación más concisa y más fácil de entender para los componentes léxicos. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Se construyen automáticamente analizadores léxicos más eficientes a partir de expresiones regulares. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Separar la estructura sintáctica de un lenguaje en partes léxicas y no léxicas proporciona una forma conveniente de modular la etapa inicial de un compilador en dos componentes de tamaño razonable. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Las expresiones regulares son muy útiles para describir identificadores, constantes, palabras clave, etc. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="line-height: 115%; mso-bidi-font-family: Wingdings;">Ø </span><span style="line-height: 115%;">Las gramáticas son muy útiles para describir estructuras anidadas, estructuras de control, etc. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: right;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="font-size: large;"><span style="color: blue;"><b style="mso-bidi-font-weight: normal;"><span style="font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 10.5pt;">3.4 Análisis sintáctico descendente</span></b><b style="mso-bidi-font-weight: normal;"><span style="font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 10.5pt;"> <o:p></o:p></span></b></span></span></span></div><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Se considera un intento de encontrar una derivación por la izquierda para una cadena de entrada. <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">También se puede considerar como un intento de construir un árbol de análisis sintáctico para la entrada comenzando desde la raíz y creando nodos del árbol en orden previo. 3.5 Análisis sintáctico ascendente El análisis sintáctico ascendente intenta construir un árbol para la cadena de entrada que comienza por las hojas (el fondo) y avanza hacia la raíz (la cima). <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Se puede considerar este proceso como de “reducir” una cadena x al símbolo inicial de la gramática. <o:p></o:p></span></span></div><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: right;"><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="font-size: large;"><span style="color: blue;"><o:p><span lang="ES" style="color: blue; font-family: "Georgia","serif"; font-size: 18pt; font-variant: small-caps; mso-ansi-language: ES; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: ES;"><strong>3.5 Análisis sintáctico por precedencia de operadores</strong></span></o:p></span></span></span></span></div><span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%;">Para una pequeña clase de gramáticas se puede construir con facilidad a mano eficientes analizadores sintácticos ascendentes. Estas gramáticas, por precedencia de operadores, tienen la propiedad de que ningún lado derecho de la producción es є ni tiene 2 terminales adyacentes. Una gramática con esta última propiedad de denomina gramática de operadores. Esta técnica, históricamente, se describió primero como una manipulación de componentes léxicos sin hacer referencia a ninguna gramática subyacente. Dada su sencillez, se han construido muchos compiladores que utilizan las técnicas de análisis sintáctico por precedencia de operadores para expresiones. </span><span style="line-height: 115%;"><o:p></o:p></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span></div><div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: right;"><span style="font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 10.5pt;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="color: blue;"><span style="font-size: large;"><strong>3.6 Analizadores sintácticos Izquierda-Derecha (LR)<o:p></o:p></strong></span></span></span></span></div><span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%;">Es una técnica eficiente de análisis sintáctico ascendente que se puede utilizar para analizar una amplia clase de gramáticas independientes de contexto, denominada Análisis sintáctico LR(k) L es por el examen de la entrada de izquierda a derecha (left to right) R por construir una derivación por la derecha (right most derivation) en orden inverso. K por el número de símbolos de entrada de examen por anticipado utilizados para tomar decisiones del análisis sintáctico. Cuando se omite, se asume que k es 1. Este análisis es atractivo por varias razones:</span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%;">•Reconocen prácticamente todas las construcciones de los lenguajes de programación para los que se pueden escribir gramáticas independientes del contexto. </span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">•Puede detectar un error sintáctico tan pronto como sea posible hacerlo en un examen de izquierda a derecha de la entrada. <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif;"><br />
</span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: right;"><b style="mso-bidi-font-weight: normal;"><span style="font-variant: small-caps; line-height: 115%; mso-bidi-font-size: 10.5pt;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="color: blue;"><span style="font-size: large;">3.7 Uso de gramáticas ambiguas <o:p></o:p></span></span></span></span></b></div><span style="line-height: 115%;"><span style="font-family: Georgia, "Times New Roman", serif;">Gramática ambigua es aquella que produce más de un árbol de análisis sintáctico para alguna frase, es decir, una gramática ambigua es la que produce más de una derivación por la izquierda o por la derecha para la misma frase. Algunos tipos de gramáticas ambiguas son útiles en la especificación e implementación de lenguajes. Se utiliza para el aislamiento de construcciones sintácticas habituales para optimación en casos especiales. <o:p></o:p></span></span><br />
<span style="font-family: Georgia, "Times New Roman", serif; line-height: 115%; mso-ansi-language: ES-MX; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Con una gramática ambigua se pueden especificar las construcciones de casos especiales añadiendo cuidadosamente nuevas producciones a la gramática. Las construcciones ambiguas se deben usar raramente y de una manera estrictamente controlada, pues de lo contrario no se puede reconocer con seguridad el lenguaje que reconoce el analizador.</span></div><div style="text-align: justify;"><span style="font-family: Georgia, "Times New Roman", serif;">Para más informacion visita estos links (enlaces):</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><a href="http://www.giaa.inf.uc3m.es/docencia/ITIG/sintactico.pdf"><span style="background-color: white; color: red;">Pdf de Analisis sintáctico</span></a></div><div style="text-align: justify;"><a href="http://traductoresune.blogspot.com/2007/05/compiladores.html"><span style="background-color: white; color: red;">Informacion de otro Blog</span></a></div><div style="text-align: justify;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4eOudR35rBwvu7JU-BdkgWdnZ7cS_EHW2nQnsCC3Wai_lMHJXSi73ZKCjogjV44w4IzoKGgYWx3_9RlOIPYjRUIsQfFIchH9geQmiBQdwdK0E4dJXMSlJFzlCYdvr7b3H9TD7K2dYT-I7/s1600/related.png" style="margin-left: auto; margin-right: auto;" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br />
</div><div align="center">No la rieges</div></td></tr>
</tbody></table></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com0tag:blogger.com,1999:blog-6282817495601970990.post-86498588497216983022011-05-18T09:04:00.000-05:002011-05-18T09:04:05.942-05:00UNIDAD 4: HERRAMIENTA PARA GENERAR COMPILADORES<div style="text-align: justify;"><span style="color: #cc0000; font-family: Verdana,sans-serif; font-size: x-large;"></span><br />
<a name='more'></a></div><div style="text-align: justify;"><div style="text-align: right;"><span style="font-size: large;"><span style="color: #0070c0; font-family: "Georgia","serif"; line-height: 115%; text-transform: uppercase;">4.1</span><b><span style="color: #0070c0; font-family: "Georgia","serif"; line-height: 115%; text-transform: uppercase;"> </span></b></span><span style="color: #0070c0; font-family: "Georgia","serif"; font-size: large; line-height: 115%; text-transform: uppercase;">Herramientas tradicionales</span></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwD6QyCcqEPaYDttbTFfln3m0uirKPAbhO-ihSZGqMO_i86INvaovD3CYxX4qu3NwVXVF3WoCR5wRjmZxcnw2-hErbtmBwtVy98okBr7el0D98PI1kkDx-FVq-MrqucS1YAm2omQTJaZCu/s1600/Herramientas+tradicionales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjl25-fBQmF9NhxLB00KxyuJuK08zo8drtCHCRF9MEUfBCRzE9A3KRkgVWPUaq4Ww-3YSf9EILgJ-HV7rod8yRZtXdLG-IgBauVg70QUsfmOzVSbatAmEJXFBNtvnueaG4NnrYCdQDWcb/s1600/Herramientas+tradicionales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjl25-fBQmF9NhxLB00KxyuJuK08zo8drtCHCRF9MEUfBCRzE9A3KRkgVWPUaq4Ww-3YSf9EILgJ-HV7rod8yRZtXdLG-IgBauVg70QUsfmOzVSbatAmEJXFBNtvnueaG4NnrYCdQDWcb/s1600/Herramientas+tradicionales.png" /> </a></div><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: right;"></div><div style="text-align: right;"><br />
</div><div style="text-align: right;"><span style="color: #0070c0; font-family: "Georgia","serif"; font-size: 14pt; line-height: 115%; text-transform: uppercase;"><span style="font-size: large;">4.2 HERRAMIENTAS DE NUEVA GENERACIÓN</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwD6QyCcqEPaYDttbTFfln3m0uirKPAbhO-ihSZGqMO_i86INvaovD3CYxX4qu3NwVXVF3WoCR5wRjmZxcnw2-hErbtmBwtVy98okBr7el0D98PI1kkDx-FVq-MrqucS1YAm2omQTJaZCu/s1600/Herramientas+tradicionales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwD6QyCcqEPaYDttbTFfln3m0uirKPAbhO-ihSZGqMO_i86INvaovD3CYxX4qu3NwVXVF3WoCR5wRjmZxcnw2-hErbtmBwtVy98okBr7el0D98PI1kkDx-FVq-MrqucS1YAm2omQTJaZCu/s1600/Herramientas+tradicionales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"> </a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwD6QyCcqEPaYDttbTFfln3m0uirKPAbhO-ihSZGqMO_i86INvaovD3CYxX4qu3NwVXVF3WoCR5wRjmZxcnw2-hErbtmBwtVy98okBr7el0D98PI1kkDx-FVq-MrqucS1YAm2omQTJaZCu/s1600/Herramientas+tradicionales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"> </a></div><div style="text-align: right;"><div style="text-align: right;"><br />
<span style="font-size: large;"><span style="color: #0070c0; font-family: "Georgia","serif"; line-height: 115%; text-transform: uppercase;"> </span></span><span style="color: #0070c0; font-family: "Georgia","serif"; font-size: large; line-height: 115%; text-transform: uppercase;"></span></div><div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSM6l9Q26bDOcvVR3UzXXhRk49QeFdHmmiK-O52tvAyADO7p2dv1ys0qOqd0uxdlXESLyBR84v_lXFVO5dQ9CA03PLgk6tH2Scxdi5ETFgiwn-cevWzHq7jza9lXF4u-5sGR8Lu2CGKaHC/s1600/herramienta+de+nueva+generacion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSM6l9Q26bDOcvVR3UzXXhRk49QeFdHmmiK-O52tvAyADO7p2dv1ys0qOqd0uxdlXESLyBR84v_lXFVO5dQ9CA03PLgk6tH2Scxdi5ETFgiwn-cevWzHq7jza9lXF4u-5sGR8Lu2CGKaHC/s1600/herramienta+de+nueva+generacion.png" /></a></div><br />
</div></div><div style="text-align: right;"><span style="color: #0070c0; font-family: "Georgia","serif"; font-size: 14pt; line-height: 115%; text-transform: uppercase;"><span style="font-size: large;">4.3 OTRAS HERRAMIENTAS</span></span></div><div style="text-align: right;"><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPjKHJZzXOX35evfp8v7a_XL5B_yUEn2gbj5SGg7o-LB6cGBPQNkCyeLoS5YVWk9ZIBHCaFYMpDU1NsuCQWiFa7B59e4Im-ZNHVfKmWZbqpnPjckKfhtM-yGOpEEF3A_scAmZTY8UhCeTW/s1600/otras+herramientas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPjKHJZzXOX35evfp8v7a_XL5B_yUEn2gbj5SGg7o-LB6cGBPQNkCyeLoS5YVWk9ZIBHCaFYMpDU1NsuCQWiFa7B59e4Im-ZNHVfKmWZbqpnPjckKfhtM-yGOpEEF3A_scAmZTY8UhCeTW/s1600/otras+herramientas.png" /></a></div><br />
</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs7hGFHNXjFg2ufnXtN5ZiKoRffrp88KwEyf_0DHbVYl7DxM8kYzNjGvqwuHJixcrb5kQ2nY11uXfbeiufCCaDX9NOKhagYKNi2X1hLUxIl1_8ReoSxS6_6tMTyh49yK3wbcX2oadhlw9F/s1600/OTRAS+HERRAMIENTAS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><span style="color: #0070c0; font-family: "Georgia","serif"; font-size: 14pt; line-height: 115%; text-transform: uppercase;"><span style="font-size: large;">4.4 KITS PARA LA CONSTRUCCIÓN DE COMPILADORES</span></span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW-956OjQt77JYoB9vreelFmbfbvq6-hG7IM2YSznrzRzWhkhrSVZlzHCNhjdTpJ8EXMqsD2FYfqJWBUs8KnQLJIATs8cR-mOJzkrQCgQ5H6wDz0OHa2DDrYJxxP5cKm7UrcS8E6RnOt1Q/s1600/kirs+pa+ra+la+construccion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW-956OjQt77JYoB9vreelFmbfbvq6-hG7IM2YSznrzRzWhkhrSVZlzHCNhjdTpJ8EXMqsD2FYfqJWBUs8KnQLJIATs8cR-mOJzkrQCgQ5H6wDz0OHa2DDrYJxxP5cKm7UrcS8E6RnOt1Q/s1600/kirs+pa+ra+la+construccion.png" /></a></div><br />
<div style="color: yellow;"><br />
</div><div style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><span style="color: yellow;">NOTA: PARA MAS INFORMACIÓN VISITE LOS SIGUIENTES ENLACES:</span></span></div><div style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><br />
</span></div><div style="color: yellow; font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">http://gatjos.galeon.com/</span></div><div style="color: yellow; font-family: Georgia,"Times New Roman",serif;"><br />
</div><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: yellow;">http://www.wikilearning.com/curso_gratis/generadores_de_codigo-compiladores_y_generacion_de_codigo/10114-2 </span></span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRLm2yaOacCkIweKzLk7HJ0-RJ8xP4tXR1GicZ1uxxYp5wxPgMq6uPgM2I13sx-HkAz7D3APyLekk8uPcFrzJZ4xqA3r3mGNo7A7zNXBaNeI195jEOJOp7BBopG9yvBtRoj1aI2_R5bfE8/s1600/KITS+PARA+GENERAR.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com0tag:blogger.com,1999:blog-6282817495601970990.post-59946403589089172011-05-18T08:57:00.004-05:002011-05-20T00:11:51.440-05:00UNIDAD 5: ANALISIS SEMANTICO<div align="center" class="MsoNormal" style="text-align: center;"><span style="font-size: x-large;"><span style="color: red; font-family: "Verdana","sans-serif"; line-height: 115%;"></span></span><br />
<span style="font-size: x-large;"><span style="color: red; font-family: "Verdana","sans-serif"; line-height: 115%;"></span></span><br />
<a name='more'></a><span style="font-size: x-large;"><span style="color: red; font-family: "Verdana","sans-serif"; line-height: 115%;">ANÁLISIS SEMÁNTICO</span></span></div><div align="center" class="MsoNormal" style="text-align: center;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif";">5.1 FUNCION DEL ANÁLISIS SEMÁNTICO</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Los programas que se compilan no son solamente cadenas de símbolos sin ningún significado que pueden ser aceptadas como correctas o no por una máquina abstracta. El lenguaje no es más que el vehículo por el cual se intenta transmitir una serie de instrucciones a un procesador para que éste las ejecute produciendo unos resultados. Por ello, la tarea del compilador requiere la extracción del contenido semántico incluido en las distintas sentencias del programa.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Por todo ello, se hace necesario dotar al compilador de una serie de rutinas auxiliares que permitan captar todo aquello que no se ha expresado mediante la sintaxis del lenguaje y todo aquello que hace descender a nuestro lenguaje de programación de las alturas de una máquina abstracta hasta el nivel de un computador real. A todas estas rutinas auxiliares se les denomina genéricamente <b>análisis semántico</b>.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">El análisis semántico, a diferencia de otras fases, no se realiza claramente diferenciado del resto de las tareas que lleva a cabo el compilador, más bien podría decirse que el análisis semántico completa las dos fases anteriores de análisis lexicográfico y sintáctico incorporando ciertas comprobaciones que no pueden asimilarse al mero reconocimiento de una cadena dentro de un lenguaje.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">La fase de <b>análisis semántico </b>revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un componente importante del análisis semántico es la <i>Verificación de Tipos. </i>Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente.</span></span></div><div align="center" class="MsoNormal" style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcr8Um-azWROApRsxMSbHhwcyZYWK-AQqIemILjfpp5JLKd_Pz575XXTKJVY5thrOJczmzd8Gmpb16ANrcznPfVXAOz6V52-rpHRectwn2wXyqTfW1chdWVGpR19piKFt0X6UCYExI7GUx/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcr8Um-azWROApRsxMSbHhwcyZYWK-AQqIemILjfpp5JLKd_Pz575XXTKJVY5thrOJczmzd8Gmpb16ANrcznPfVXAOz6V52-rpHRectwn2wXyqTfW1chdWVGpR19piKFt0X6UCYExI7GUx/s1600/1.png" /></a></div><span style="font-size: small;"><span style="font-family: "Georgia","serif";"><br />
</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede permitir ciertas coerciones a los operadores.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZA8x8h9HboKdadIRHfd-Dia0l8UoaABxncI16Nb_orzu9TM4ER1AE1Z9_dZlV7RWmQYNjSDegljZLwMR7E5_YH93wD5nTW1NSZvfzKvBV9sL2CNpy5-5Bc1Bikpwp4YFY5ig6B33y02X8/s1600/Analissi+Semantico.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZA8x8h9HboKdadIRHfd-Dia0l8UoaABxncI16Nb_orzu9TM4ER1AE1Z9_dZlV7RWmQYNjSDegljZLwMR7E5_YH93wD5nTW1NSZvfzKvBV9sL2CNpy5-5Bc1Bikpwp4YFY5ig6B33y02X8/s640/Analissi+Semantico.JPG" width="185" /></a></div><br />
</div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="color: yellow; font-family: "Georgia","serif"; line-height: 115%;"><span style="color: orange;">Para más información consulta</span>: </span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/apuntes01"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Compilador</span></b></span></a></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/clase15-8034564"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Análisis Semántico</span></b></span></a><br />
<br />
<span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://www.youtube.com/watch?v=1zwZ1sAMqng">Video Análisis Semántico I</a></span></b></span><br />
<span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://www.youtube.com/watch?v=lAhqXLDzwV8&feature=related">Video Análiis Semántico II </a></span></b></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif"; line-height: 115%;">5.2 REGLAS SEMANTICAS</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un lenguaje está formado por <i>reglas semánticas </i>que proporcionan el significado a una sentencia o instrucción del lenguaje. Las reglas semánticas vienen dadas en función de los atributos de los demás símbolos que componen la regla. La evaluación de las reglas semánticas puede generar código, guardar información en una tabla de símbolos, emitir mensajes de error o realizar otras actividades. La traducción de la cadena de componentes léxicos es el resultado obtenido al evaluar las reglas semánticas. La evaluación de las reglas semánticas define los valores de los atributos en los nodos del árbol de análisis sintáctico para la cadena de entrada. Una regla semántica también puede tener efectos colaterales, por ejemplo, imprimir un valor o actualizar una variable global.</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta: </span></span></div></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/analisis-semantico-8034380"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">ANÁLISIS SEMÁNTICO</span></b></span></a></div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif"; line-height: 115%;">5.3 COMPATIBILIDAD DE TIPOS</span></span></div><div class="Default" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";">Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintácticas como las semánticas del lenguaje fuente. Esta comprobación, llamada <b><i>comprobación estática </i></b>(para distinguirla de la <b><i>comprobación dinámica </i></b>que se realiza durante la ejecución del programa objeto), garantiza la detección y comunicación de algunas clases de errores de programación. Los ejemplos de comprobación estática incluyen: </span></span></div><div class="Default" style="margin-bottom: 6.35pt; text-align: justify;"><ol><li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"><i>Comprobaciones de tipos. </i>Un compilador debe informar de un error si se aplica un operador a un operando incompatible, por ejemplo, si se suman una variable tipo matriz y una variable de función.</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"><i> </i></span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"><i>Comprobaciones del flujo de control. </i>Las proposiciones que hacen que el flujo del control abandone una construcción deben tener algún lugar a dónde transferir el flujo de control Por ejemplo, una proposición <b>break </b>en C hace que el control abandone la proposición que la engloba, <b>while, for </b>o <b>switch </b>más cercana si dicha proposición englobadora no existe, ocurre un error.</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"><i> </i></span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"><i>Comprobaciones relacionadas con nombres. </i>En ocasiones, el mismo nombre debe aparecer dos o más veces en un mismo bloque de instrucciones, el compilador debe comprobar que se utilice el mismo nombre en ambos sitios. </span></span></li>
</ol></div><div class="Default" style="text-align: justify;"></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un <b><i>comprobador de tipos </i></b>se asegura de que el tipo de una construcción coincida con el previsto en su contexto.</span></span></div><div align="center" class="MsoNormal" style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8gynMNWdobLUaBCLDf-M8kC9LLEtBjQltpUfx-jpmp1rHzGyvqNVH5pruNY7wP7Ank3gBYzNfA1S_fPXWLMRqX0MhuNgKXHfnaMgsbGi6DOy-KvqM0ArL-XaxQes_1jejEsOLvaIYK77/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8gynMNWdobLUaBCLDf-M8kC9LLEtBjQltpUfx-jpmp1rHzGyvqNVH5pruNY7wP7Ank3gBYzNfA1S_fPXWLMRqX0MhuNgKXHfnaMgsbGi6DOy-KvqM0ArL-XaxQes_1jejEsOLvaIYK77/s1600/2.png" /></a></div><span style="font-size: small;"><span style="font-family: "Georgia","serif";"><br />
</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Puede necesitarse la información sobre los tipos reunida por un comprobador de tipos cuando se genera el código.</span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta: </span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/clase15-8034564"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Análisis Semántico</span></b></span></a></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/ps2-u5"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Análisi-Semántico</span></b></span></a></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/downloadphp-8034746"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">A. Semántico Chequeo de Tipos</span></b></span></a></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif"; line-height: 115%;">5.4 SISTEMAS DE TIPOS</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">El diseño de un comprobador de tipos para un lenguaje se basa en información acerca de las construcciones sintácticas del lenguaje, la noción de tipos y las reglas para asignar tipos a las construcciones de lenguaje. En Pascal y en C, los tipos son básicos o construidos. Los tipos básicos son los tipos atómicos sin estructura interna por lo que concierne al programador (<i>bolean, carácter, integer, real). </i>Los tipos de subrango como 1.10, y los tipos enumerados, como (violeta, índigo, azul, verde, amarillo, naranja) se pueden considerar como tipos básicos. Además, los apuntadores y las funciones también pueden considerarse como tipos construidos.</span></span></div><div class="Default" style="text-align: justify;"><br />
<div style="color: lime;"><span style="font-size: small;"><b><span style="font-family: "Verdana","sans-serif";">Expresiones de tipos </span></b></span></div></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">El tipo de una construcción de un lenguaje se denotará mediante una “expresión de tipo”. De manera informal, una <b>expresión de tipo </b>es, o bien un tipo básico o se forma aplicando un operador llamado <i>constructor de tipos </i>a otras expresiones de tipos. Los conjuntos de tipos y constructores básicos dependen del lenguaje que deba comprobarse. Cada lenguaje de programación requerirá unas expresiones de tipos adecuadas a sus características. A continuación, a modo de ejemplo, se definen las expresiones de tipos más comunes:</span></span></div><div class="Default" style="margin: 0cm 0cm 6.5pt 36pt; text-align: justify; text-indent: -18pt;"><ul><li><span style="font-size: small;"><span style="color: windowtext;"><span style="font-family: Symbol;"> </span></span><b><span style="color: windowtext; font-family: "Georgia","serif";">Tipos simples: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Son expresiones de tipos los tipos simples del lenguaje, y algunos tipos especiales:</span></span><ul><li><span style="font-size: small;"> I<span style="color: windowtext; font-family: "Georgia","serif";">nteger</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> </span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> Real</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> </span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> Char</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> </span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> Boolean</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> </span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";"> Void</span></span><span style="font-size: small;"> </span></li>
<li><span style="font-size: small;"> E<span style="color: windowtext; font-family: "Georgia","serif";">rror </span></span></li>
</ul></li>
</ul></div><div class="Default" style="text-align: justify;"></div><div class="Default" style="text-align: justify;"><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";">Los cuatro primeros son los tipos de datos simples más comunes en los lenguajes de programación, los dos últimos son tipos simples especiales que usaremos para su atribución a diversas partes de un programa, a fin de homogeneizar el tratamiento de todo el conjunto mediante el método de las expresiones de tipos. </span></span></div><div class="Default" style="text-align: justify;"><br />
</div><div class="Default" style="text-align: justify;"><span style="font-size: small;"><span style="color: windowtext; font-family: "Georgia","serif";">Tomando el lenguaje C como ejemplo, el segmento de código al que está asociada la expresión de tipos <i>integer </i>es aquella en que aparece la palabra reservada <i>int</i>, etc.</span></span></div><div class="MsoNormal" style="text-align: justify;"></div><div class="Default" style="margin: 0cm 0cm 5.9pt 36pt; text-align: justify; text-indent: -18pt;"><ul><li><span style="font-size: small;"><span style="color: windowtext; font-family: Symbol;"><span style="-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span><b><span style="color: windowtext; font-family: "Georgia","serif";">Constructores de tipos: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Permiten formar tipos complejos a partir de otros más simples. La semántica de cada lenguaje tiene asociada unos constructores de tipos propios. En general, en los lenguajes de programación se definen los siguientes constructores: </span></span></li>
</ul></div><div class="Default" style="margin-left: 63.8pt; text-align: justify; text-indent: -18pt;"><ul><li><span style="font-size: small;"><span style="color: windowtext;"><span style="font-family: Symbol;"> </span></span><b><span style="color: windowtext; font-family: "Georgia","serif";">Matrices: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Si T es una expresión de tipos, entonces <i>array(R,T) </i>es también una expresión de tipos que representa a una matriz de rango <i>R </i>de elementos de tipo <i>T</i>.</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: Symbol;"> Ejemplo: Sea el segmento de código C: char a[10</span><b><span style="color: windowtext; font-family: "Georgia","serif";">]</span></b></span><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> </span></b></span></li>
<li><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> Productos: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Sea <i>T1 </i>y <i>T2 </i>expresiones de tipos, <i>T1 x T2 </i>es una expresión de tipos que representa al producto cartesiano de los tipos <i>T1 </i>y <i>T2</i>. A fin de simplificar consideraremos que el constructor u operador de tipos <i>x </i>es asociativo por la izquierda.</span></span><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> </span></b></span></li>
<li><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> Registros: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Sea un registro formado por los campos <i>u1, u2 ... uN</i>, siendo cada uno de ellos de los tipos <i>T1,T2 ... TN</i>, entonces, la expresión de tipos asociada al conjunto es: record ( (u1:T1) x (u2:T2) x ... x (uN:TN) )</span></span><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> </span></b></span></li>
<li><span style="font-size: small;"><b><span style="color: windowtext; font-family: "Georgia","serif";"> Punteros: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Si <i>T </i>es una expresión de tipos, entonces <i>pointer(T) </i>es una expresión de tipos que representa a un puntero a una posición de memoria ocupada por un dato de tipo <i>T</i>.</span></span><span style="font-size: small;"><span style="color: windowtext; font-family: Symbol;"><span style="-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span></span></li>
<li><span style="font-size: small;"><span style="color: windowtext; font-family: Symbol;"><span style="-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-family: "Times New Roman"; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"> </span></span><b><span style="color: windowtext; font-family: "Georgia","serif";">Funciones: </span></b><span style="color: windowtext; font-family: "Georgia","serif";">Sean <i>T1,T2 ... TN</i>, las expresiones de tipos asociadas a los segmentos de código correspondientes a los argumentos de una función, y sea <i>T </i>el tipo devuelto por la función. Entonces, la expresión de tipos asociada a la función es:</span></span><span style="font-size: small;"><span style="font-family: "Georgia","serif";"> ((T1xT2 x... xTN) -> T )</span><span style="color: black; font-family: "Arial","sans-serif";"> </span></span></li>
</ul></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0pt; text-align: justify;"></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0pt; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif";">Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos. </span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0pt; text-align: justify;"><br />
</div><div class="Default" style="text-align: left;"><span style="font-size: small;"><b><span style="color: #1f497d; font-family: "Georgia","serif";"><span style="color: lime; font-family: Verdana,sans-serif; font-size: small;"> Sistemas de tipos</span></span></b></span><br />
<span style="font-size: small;"><b><span style="color: #1f497d; font-family: "Georgia","serif";"><span style="color: lime; font-family: Verdana,sans-serif; font-size: small;"> </span> </span></b><span style="color: #1f497d; font-family: "Georgia","serif";"></span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0pt; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif";">Un <b><i>sistema de tipos </i></b>es una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa y verificar su corrección. En concreto, formarán el sistema de tipos las definiciones y reglas que permiten comprobar cuál es el dominio asignado a una variable, y en qué contextos puede ser usada. Cada lenguaje tiene un sistema de tipos propio, aunque a veces puede variar de una a otra implementación. Un sistema de tipos incluye tanto comprobaciones estáticas como dinámicas, según si se realizan en tiempo de compilación o en tiempo de ejecución. Como es lógico, mientras más comprobaciones puedan realizarse en la fase de compilación, menos tendrán que realizarse durante la ejecución, con la consiguiente mejora en la eficiencia del programa objeto. En la práctica ningún lenguaje es tan fuertemente estructurado que permita una completa comprobación estática de tipos.</span><span style="font-family: "Georgia","serif";"></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="color: orange; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta: </span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/clase15-8034564"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Análisis Semántico</span></b></span></a></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="http://www.slideshare.net/Areliwampy/ps2-u5"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">Análisis-Semántico</span></b></span></a></div><div class="MsoNormal" style="color: orange; text-align: justify;"><a href="hhttp://www.slideshare.net/Areliwampy/downloadphp-8034746"><span style="font-size: small;"><b><span style="font-family: "Georgia","serif"; line-height: 115%;">A. Semántico Chequeo de Tipos</span></b></span></a></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif";">5.5 COMPROBACION ESTATICA Y DINAMICA DE LOS TIPOS</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Se dice que la comprobación realizada por un compilador es estática, mientras que la comprobación hecha al ejecutar el programa objeto se denomina dinámica. En principio, cualquier verificación se puede realizar dinámicamente, si el código objeto carga el tipo de un elemento con el valor de dicho elemento.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un sistema de tipos seguro elimina la necesidad de comprobar dinámicamente errores de tipos ya que permite determinar estáticamente que dichos errores no pueden ocurrir cuando se está ejecutando el programa objeto. Se dice que un lenguaje es fuertemente tipificado si su compilador puede garantizar que los programas que acepte se ejecutarán sin errores de tipo.</span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta: <a href="http://www.slideshare.net/Areliwampy/analisis-semantico-8034380">ANALISIS SEMANTICO</a></span></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal" style="text-align: left;"><div style="color: lime;"><b><span style="font-size: small;"><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">Recuperación de errores</span></span></b></div></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un sistema de tipos seguro elimina la necesidad de comprobar dinámicamente errores de tipos ya que permite determinar estáticamente que dichos errores no pueden ocurrir cuando se está ejecutando el programa objeto. Se dice que un lenguaje es fuertemente tipificado si su compilador puede garantizar que los programas que acepte se ejecutarán sin errores de tipo.</span></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif";">5.6 COMPROBACIÓN DE TIPOS EN EXPRESIONES, SENTENCIAS Y FUNCIONES</span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">A partir de reglas semánticas se desarrolla la comprobación de tipos para expresiones, sentencias y funciones. El comprobador de tipos es un esquema de traducción que sintetiza el tipo de cada expresión a partir de los tipos de las sub-expresiones. El comprobador de tipos puede manejar matrices, apuntadores, proposiciones y funciones.</span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta: <a href="http://www.slideshare.net/Areliwampy/ps2-u5">Análisis-Semántico</a></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div></div><div style="text-align: right;"></div><div class="MsoNormal" style="text-align: right;"></div><div style="text-align: right;"></div><div class="MsoNormal" style="text-align: right;"><span style="font-size: large;"><span style="color: #1f497d; font-family: "Georgia","serif";">5.7 CONVERSIONES DE TIPOS, SOBRECARGA DE FUNCIONES Y OPERADORES, FUNCIONES POLIMÓRFICAS</span></span></div><div class="MsoNormal" style="text-align: left;"><br />
<div style="color: lime;"><b><span style="font-size: small;"><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">Conversiones de tipos</span></span></b></div></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Considérense expresiones como <b>x </b>+ <b>i </b>donde <b>x </b>es de tipo real e <b>i </b>es de tipo entero. Como representación de enteros y reales es distinta dentro de un computador, y se utilizan instrucciones de máquina distintas para las operaciones sobre enteros y reales, puede que el compilador tenga que convertir primero uno de los operandos de + para garantizar que ambos operandos sean del mismo tipo cuando tenga lugar la suma.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">La definición del lenguaje especifica las conversiones necesarias. Cuando un entero se asigna a un real, o viceversa, la conversión es al tipo del lado izquierdo de la asignación. En expresiones, la transformación más común es la de convertir el entero en un número real y después realizar una operación real con el par de operandos reales obtenidos. Se puede utilizar el comprobador de tipos en un compilador para insertar estas operaciones de conversión en la representación intermedia del programa fuente.</span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulta:<a href="http://www.slideshare.net/Areliwampy/ps2-u5">Análisis-Semántico</a></span></span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="color: lime; text-align: left;"><b><span style="font-size: small;"><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">Coerciones</span></span></b></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">La definición del lenguaje especifica las conversiones necesarias. Cuando un entero se asigna a un real, o viceversa, la conversión es al tipo del lado izquierdo de la asignación. En expresiones, la transformación más común es la de convertir el entero en un número real y después realizar una operación real con el par de operandos reales obtenidos. Se puede utilizar el comprobador de tipos en un compilador para insertar estas operaciones de conversión en la representación intermedia del programa fuente.</span></span></div><div class="MsoNormal" style="text-align: left;"><div style="color: lime;"><b><span style="font-size: small;"><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">Sobrecarga de funciones y operadores</span></span></b></div></div><div class="Default" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif";">Un símbolo sobrecargado es el que tiene distintos significados dependiendo de su contexto. La sobrecarga se resuelve cuando se determina un significado único para un caso de un símbolo sobrecargado. La resolución de la sobrecarga a menudo aparece referida como <i>identificación de operadores </i>porque determina la operación que denota un símbolo de operador. </span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Los operadores aritméticos están sobrecargados en la mayoría de los lenguajes. Sin embargo, la sobrecarga que afecta a los operadores aritméticos como + se puede resolver observando únicamente los argumentos del operador.</span></span></div><div class="MsoNormal" style="color: orange; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulte el libro: <a href="http://www.slideshare.net/Areliwampy/analisis-semantico-8034380">ANALISIS SEMANTICO</a></span></span></div><div class="MsoNormal" style="text-align: left;"><br />
</div><div></div><div class="MsoNormal" style="text-align: left;"><div style="color: lime;"><b><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Funciones polimórficas</span></span></b></div></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">El término “polimórfico” se aplica a cualquier parte de código que pueda ejecutarse con argumentos de tipos distintos, de modo que se puede hablar de funciones, así como de operadores polimórficos. </span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Los operadores predefinidos para indicar matrices, aplicar funciones y manipular apuntadores son generalmente polimórficos porque no se limitan a una determinada clase de matriz, función o apuntador.</span></span></div><div class="MsoNormal" style="text-align: justify;"><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Para más información consulte el libro: <a href="http://www.slideshare.net/Areliwampy/analisis-semantico-8034380">ANALISIS SEMANTICO</a></span></span></div><br />
<div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Más información acerca de este tema y compiladores </span></span></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://www.slideshare.net/Areliwampy/10-conceptos-basicosprocesadoreslenguaje">Compiladores</a></span></span></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://www.slideshare.net/Areliwampy/semanticoapun">Análisis- Semántico II </a></span></span></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://www.slideshare.net/Areliwampy/tr-asemver">Análisis-Semántico</a></span></span></div><div style="color: orange;"><a href="http://www.slideshare.net/pepgonzalez/analisis-semantico"><span style="font-size: small;"><span style="font-family: "Georgia","serif";">Análisis-Semántico</span></span></a></div><div style="color: orange;"><a href="http://docs.google.com/viewer?a=v&q=cache:RnBUKFlhhN8J:www.dirinfo.unsl.edu.ar/%7Ecompi/2002/teorias/clase11.doc+analisis+semantico&hl=es&gl=mx&pid=bl&srcid=ADGEEShYqiA_DqwGD9jT69Hoc68Q5g4CYDhg6GTneYHMmTj6GV8w344iF0hnqKh_KgmUkDwggt-vTFHEmr6ZC6Um9RPdbtXbkB5K5aUhH2qEAxTLnD0qiHGoh4S9evGcXjd8Lvqtq3BK&sig=AHIEtbQ037tnaZiDynnMBxCm7eLO-ccEfw"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Semántico</span></span></a></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/Sesion_III_3U___Analisis_Semantico.pdf">Semántico II</a> </span></span></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Compilador</span></span></div><div style="color: orange;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;"><a href="http://docs.google.com/viewer?a=v&q=cache:vSS197JVaQoJ:www.pelogo.org/data/files/CURSOProgSist.ppt+analisis+semantico+en+compiladores&hl=es&gl=mx&pid=bl&srcid=ADGEESjwEKJNEccZ5yvK3ZsLrx-apiwqrQvGCK-iwrmR2krLdMS10VgtZQhysnuXcu32ZGIppyZS0LVYhTQrWBfywXEfmmGYEvgeTVZsPYDMW7ykK1VwMoyB-fpeUtaXNfaYJ7petTaK&sig=AHIEtbQ1oN2dLNRhmtqIEVPjG3zLNUNmgw">Compiladores I</a> </span></span></div><span style="font-size: small;"><span style="color: yellow; font-family: "Georgia","serif"; line-height: 115%;"><br />
</span></span><br />
<span style="font-size: small;"><span style="color: yellow; font-family: "Georgia","serif"; line-height: 115%;"><br />
</span></span><br />
<span style="font-size: small;"><span style="color: yellow; font-family: "Georgia","serif"; line-height: 115%;"><br />
</span></span></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com1tag:blogger.com,1999:blog-6282817495601970990.post-36913467660585996692011-05-18T08:37:00.002-05:002011-05-18T08:57:20.996-05:00UNIDAD 6: TRADUCCIÓN DIRIGIDA POR SINTAXIS<a name='more'></a> <style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style> <br />
<div class="MsoNormal" style="color: red; text-align: center;"><span style="font-size: x-large;"><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">T</span><span style="font-family: "Verdana","sans-serif"; line-height: 115%;">RADUCCIÓN DIRIGIDA POR SINTAXIS</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Un compilador utiliza gramáticas independientes de contexto como guía para la traducción de lenguajes, si logra de alguna manera asociar información a las distintas construcciones del lenguaje de programación proporcionando atributos a los símbolos de la gramática, puede entonces calcular sus valores mediante reglas semánticas.</span></span></div><div class="MsoNormal" style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">Aunque hay dos maneras de hacer la asociación entre reglas semánticas y producciones, que son mediante definiciones dirigidas por sintaxis y esquemas de traducción, nos interesa particularmente ésta última, pues con éstas se trabaja más pues se puede definir el orden en que se ejecutan las acciones y las evaluaciones de los atributos.</span></span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-size: small;"><span style="font-family: "Georgia","serif"; line-height: 115%;">La idea es brindar al lector una pequeña reseña de lo que el compilador hace desde que toma una cadena de entrada hasta que la lleva a evaluar las reglas semánticas, que es una parte importante del proceso de compilación en un lenguaje de programación.</span></span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.1 DEFINICIONES DIRIGIDAS POR LA SINTAXIS</span></span><span style="font-family: "Georgia","serif";"></span></h1><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Para traducir una construcción de un lenguaje de programación, un compilador puede necesitar tener en cuenta muchas características, además del código generado para la construcción. Una definición dirigida por sintaxis es un formalismo para especificar las traducciones para las construcciones en función de atributos asociados con sus componentes sintácticos.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Utiliza una gramática independiente de contexto para especificar la estructura sintáctica de la entrada, la idea es asociar con cada símbolo de la gramática un conjunto de atributos (que luego veremos que pueden ser sintetizados o heredados) y además a cada producción un conjunto de reglas semánticas para calcular los valores de los atributos asociados con los símbolos que aparecen en esa producción. La definición dirigida por sintaxis consiste en sí entonces de la gramática y el conjunto de reglas semánticas.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">En una definición dirigida por sintaxis, para cada producción gramatical A</span><span style="font-family: "Arial","sans-serif"; font-size: 12pt; line-height: 115%;"></span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">α se asocia un conjunto de reglas semánticas de la forma b:=f(c1,c2,…,ck) donde f es una función y b es un atributo sintetizado de A o un atributo heredado de uno de los símbolos gramaticales de la parte derecha de la producción y c1,c2,…,ck son atributos que pertenecen a los símbolos gramaticales de la producción. Se dice que b depende de c1,c2,…,ck.</span></div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.2 ANÁLISIS DE LAS DEFINICIONES DIRIGIDAS POR SINTAXIS</span></span><span style="font-family: "Georgia","serif";"></span></h1><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Las funciones para un no terminal mapen los valores de los atributos heredados de un nodo con atributos sintetizados. Mientras que para los terminales se debe realizar una función por aparte, es decir distinta de la de los no terminales, sin embargo los terminales se pueden considerar como un solo grupo y ser evaluados con una simple función [1], la agrupación de dichos atributos está determinada por las dependencias que se presentan con el conjunto de reglas semánticas especificadas en la definición orientada a la sintaxis.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">La traducción dirigida a sintaxis es motivada por la sobrecarga de identificadores los cuales tiene un conjunto de posibles tipos y por lo tanto una expresión debe de elegir uno de esos tipos para cada subexpresión que involucre a dicho identificador [1]. Para solucionar dicho problema se debe de realizar un análisis ascendente para determinar los valores sintetizados y un análisis descendente para seleccionar el tipo adecuado para la expresión. Es decir, la principal implementación del análisis de las traducciones dirigidas a sintaxis es el chequeo de tipos.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Existen definiciones orientadas a sintaxis que se llaman circulares debido a que su grafo de dependencia posee ciclos y no existe ninguna forma para poder calcular los valores de los atributos en el ciclo.</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: Arial; mso-bidi-font-style: italic;"></span></div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.3 EVALUACIÓN ASCENDENTE DE LAS DEFINICIONES S-ATRIBUIDAS</span></span><span style="font-family: "Georgia","serif";"></span></h1><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Los atributos se pueden evaluar con un analizador sintáctico ascendente conforme la entrada es analizada. El analizador sintáctico puede conservar en su pila los valores de los atributos sintetizados asociados con los símbolos gramaticales. Siempre que se haga una reducción se calculan los valores de los nuevos atributos sintetizados a partir de los atributos que están en la pila para los símbolos gramaticales del lado derecho de la producción con la que se reduce.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><h2><span style="color: #4f6228; font-family: "Verdana","sans-serif"; font-size: 12pt; line-height: 115%; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-themecolor: accent3; mso-themeshade: 128;">5.3.1 Atributos sintetizados en la pila del analizador sintáctico</span></h2><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">A partir de una definición con atributos sintetizados, el generador de analizadores sintácticos puede construir un traductor que evalúe los atributos conforme analiza la entrada. Un analizador sintáctico ascendente utiliza una pila para guardar información acerca de los subárboles que ya han sido analizados. Se pueden utilizar campos adicionales en la pila del analizador para guardar los valores de los atributos sintetizados.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.4 DEFINICIONES L-ATRIBUIDAS</span></span><span style="font-family: "Georgia","serif";"></span></h1><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Cuando la traducción tiene lugar durante el análisis sintáctico, el orden de evaluación de los atributos va unido al orden en que, por el método de análisis sintáctico, se crean los nodos del árbol de análisis sintáctico. Un orden natural que caracteriza es el orden de evaluación en profundidad. Aunque de hecho no se construye el árbol de análisis sintáctico, es útil estudiar la traducción durante el análisis sintáctico considerando la evaluación en profundidad de los atributos en los nodos de un árbol de análisis sintáctico.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Se les llama “por la izquierda” porque la información de los atributos parece fluir de izquierda a derecha. Las definiciones con atributos por la izquierda incluyen todas las definiciones dirigidas por sintaxis basadas en gramáticas LL(1). Toda definición con atributos sintetizados es una definición con atributos por la izquierda.</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: Arial; mso-bidi-font-style: italic;"></span></div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.5 TRADUCCIÓN DURANTE EL ANÁLISIS DESCENDENTE</span></span></h1><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">Se trabaja con esquemas de traducción en lugar de hacerlo con definiciones dirigidas por sintaxis, así que se puede ser explícito en cuanto al orden en que tienen que lugar las acciones y las evaluaciones de los atributos.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><br />
</div><h2 style="text-align: justify;"><span style="color: #4f6228; font-family: "Verdana","sans-serif"; font-size: 12pt; line-height: 115%; mso-themecolor: accent3; mso-themeshade: 128;">Eliminación de la recursividad izquierda de un esquema de traducción</span></h2><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">Como la mayoría de los operadores aritméticos son asociativos por la izquierda, es natural utilizar gramáticas recursivas por la izquierda para las expresiones. La transformación se aplica a esquemas de traducción con atributos sintetizados.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">Para el análisis sintáctico descendente, se supone que una acción se ejecuta en el mismo momento en que se expandiría un símbolo en la misma posición. Un atributo heredado de un símbolo debe ser calculado por una acción que aparezca antes que el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe calcular después de que hayan sido calculados todos los atributos de los que depende.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><br />
</div><h2><span style="font-size: small;"><span style="color: #4f6228; font-family: "Verdana","sans-serif"; line-height: 115%;">Diseño de un traductor predictivo</span></span></h2><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">Un analizador sintáctico predictivo es un tipo especial de analizador sintáctico descendente recursivo en el que el símbolo del preanálisis determina sin ambigüedad el procedimiento seleccionado para cada no terminal. La secuencia de procedimientos llamados en el procesamiento de la entrada define</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">implícitamente un árbol de análisis sintáctico para la entrada. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; mso-bidi-font-family: TimesNewRomanPSMT;">La idea es generalizar la construcción de analizadores sintácticos predictivos para implantar un esquema de traducción basado en una gramática adecuada para el análisis sintáctico descendente. Un atributo heredado de un símbolo debe ser calculado por una acción que aparezca antes que el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe calcular después de que hayan sido calculados todos los atributos de los que depende.</span><span style="font-family: "Georgia","serif"; font-size: 12pt;"></span></div><h1 style="text-align: right;"><span style="font-size: large;"><span style="color: #365f91; font-family: "Georgia","serif";">5.6 EVALUACIÓN ASCENDENTE</span></span><span style="font-family: "Georgia","serif";"></span></h1><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Existe un método, con el cual se puede implementar cualquier definición de una sintaxis que se base en atributos L, es decir, heredados por la izquierda en gramáticas LL(1) y muchos (no todos) basados en LR(1). Este método consiste en primero tomar el esquema de traducción orientada a sintaxis que posee las acciones semánticas incrustadas y remover dichas acciones, luego se debe insertar en su lugar un no terminal distinto para cada una de las producciones, el cual funciona como marca. Finalmente se agrega una producción extra a partir del no terminal marcador, que derive a épsilon y la acción a ejecutar (la acción removida anteriormente) [1].</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Un ejemplo de dicho cambio a realizar, se presenta en la figura siguiente en donde se muestra el esquema original a) y se indica la modificación que se debe realizar b) usando como marcador un no terminal M y N en donde ambos esquemas de traducción aceptan el mismo lenguaje.</span></div><div align="center" class="MsoNormal" style="mso-layout-grid-align: none; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-fareast-language: ES-MX; mso-no-proof: yes;"><br />
</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><div align="center" class="MsoNormal" style="text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"><br />
</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvByeLznvTUetSbHuLAifK8LB6WBRjQBOU3kTWW8iy3FVUr5j_J1Fi4aNM4hpLBCjcLF-L3lP0xWPwGLCqM1H4sf1XcNGh6nZdvSNAAIT2kjjWjwcq2SjVB-95Za-ddzjSOG0j0ufMNqmE/s1600/pic+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvByeLznvTUetSbHuLAifK8LB6WBRjQBOU3kTWW8iy3FVUr5j_J1Fi4aNM4hpLBCjcLF-L3lP0xWPwGLCqM1H4sf1XcNGh6nZdvSNAAIT2kjjWjwcq2SjVB-95Za-ddzjSOG0j0ufMNqmE/s320/pic+1.png" width="320" /></a></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">El objetivo del análisis ascendente es realizar reducción, por ejemplo con una producción A </span><span style="font-family: "Arial","sans-serif"; font-size: 12pt; line-height: 115%;"></span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: Arial;"> </span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">XY, se pretende reemplazar su parte derecha por el no terminal que se encuentra a en la parte izquierda de la producción, esto se puede llevar a cabo, debido a que si el valor Y posee un valor heredado, este estaría determinado por el valor estático de X el cual se encuentra en la pila [1] Se puede determinar que el valor de X.s se encuentra en la pila debido a que se realiza un análisis de abajo hacia arriba y se analizará primero el valor de X el cual determina a valor heredado de Y ya que este último depende de X, como se mostraría en su grafico de dependencia.</span></div><div class="MsoNormal" style="text-align: justify;"><br />
</div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">El comportamiento de la gramática modificada es el siguiente: el marcador de cada producción toma el valor estático del no terminal que posee a la izquierda como su valor heredado y sintetizado, lo cual permite que el no terminal que se encuentra a la derecha del marcador tome como valor heredado el recién adquirido valor sintetizado del marcador como se muestra en las siguientes figuras.</span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoq-M5K5ezYXD2GgAdPXpRm45t5WsaV74V3O7wYSfrlmaGCl9R5jChceMgKjrJmE_kXD9WNLKTYah-nuIyAfI8s1ieMVsBa1gyNZyuXWOVQyoUrwYNwVhiAocGUjGruEcob8zNFJGo_INf/s1600/pic+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoq-M5K5ezYXD2GgAdPXpRm45t5WsaV74V3O7wYSfrlmaGCl9R5jChceMgKjrJmE_kXD9WNLKTYah-nuIyAfI8s1ieMVsBa1gyNZyuXWOVQyoUrwYNwVhiAocGUjGruEcob8zNFJGo_INf/s320/pic+4.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt3QUcLLsHNfwt2lfcagFy8dblZ4WSYOXwT5XVrtUve43vamlNHU-1gROEwIzRlQdbvq6vjnMVv0_W5wTn0zA-_NQLsj0ie-6mWGhBHsXD9ppPrISheDgyWO0E5mo9Ad78dCR3gK9b_nVg/s1600/pic+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt3QUcLLsHNfwt2lfcagFy8dblZ4WSYOXwT5XVrtUve43vamlNHU-1gROEwIzRlQdbvq6vjnMVv0_W5wTn0zA-_NQLsj0ie-6mWGhBHsXD9ppPrISheDgyWO0E5mo9Ad78dCR3gK9b_nVg/s320/pic+5.png" width="320" /></a></div><br />
<br />
<br />
<div align="center" class="MsoNormal" style="mso-layout-grid-align: none; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-fareast-language: ES-MX; mso-no-proof: yes;"><br />
</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">Gracias al trabajo realizado por las marcas (no terminales) es posible evaluar atributos L durante el análisis sintáctico LR, debido a que solo existe una única producción para cada marcado la gramática continua siendo LL y por ende LR [1], al agregar los marcadores no se produce ningún conflicto. Sin embargo, no se puede decir lo mismo de todas las gramáticas LR porque algunas si podrían presentar problemas de conflictos. A continuación se presenta un ejemplo de una gramática LR que presenta problemas a la hora de realizar el análisis sintáctico debido a que en la última de sus producciones no existe un no terminal con el cual se pueda determinar cuál es el valor heredado de L.count a imprimir y con el cual se conoce el total de Ls generadas por S.</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xh3UoxLPlkHco7uKP66C8vVjLH40EtNrcOaTzrKgsVf3iyfcoQzdG5M2aSQ_ZXGz50V9cOHX4FidLMc1jf28E9VMXmrhUCTmZIH62KUX00YPJfUyxgvWLukgtaIBoIL2_lWmod5QrT96/s1600/pic+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xh3UoxLPlkHco7uKP66C8vVjLH40EtNrcOaTzrKgsVf3iyfcoQzdG5M2aSQ_ZXGz50V9cOHX4FidLMc1jf28E9VMXmrhUCTmZIH62KUX00YPJfUyxgvWLukgtaIBoIL2_lWmod5QrT96/s320/pic+2.png" width="320" /></a></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="mso-layout-grid-align: none; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-fareast-language: ES-MX; mso-no-proof: yes;"><br />
</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><div align="center" class="MsoNormal" style="mso-layout-grid-align: none; text-align: center;"><br />
</div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">A veces es posible cambiar los valores heredados por valores sintetizados al hacer una pequeña modificación en la gramática, este cambio nos permite trabajar de manera más eficiente ya que los valores de un atributo para determinado terminal se pueden obtener de manera directa en vez de tener que heredarlo. Ejemplo de la característica anterior se presenta en el lenguaje de programación de Pascal [1], como se muestra en la figura siguiente donde se trata la producción D que permite definir una variable L con su respectivo tipo T.</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh24QfTMnUfvp32rP0lPTL5mXKZhE749Bvt4Q5C5hJuNuh13CQltO-FmfKmk3NRAshJruBhjpT2uiHYrXM9wm9vKoY8F3QQrcZJe8eB6Kj3PJA1Lmi8UA14VrbuOxSQwgPL_lrEKTVQeJqC/s1600/pic+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh24QfTMnUfvp32rP0lPTL5mXKZhE749Bvt4Q5C5hJuNuh13CQltO-FmfKmk3NRAshJruBhjpT2uiHYrXM9wm9vKoY8F3QQrcZJe8eB6Kj3PJA1Lmi8UA14VrbuOxSQwgPL_lrEKTVQeJqC/s320/pic+3.png" width="320" /></a></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="mso-layout-grid-align: none; text-align: center;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-fareast-language: ES-MX; mso-no-proof: yes;"><br />
</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div><div class="MsoNormal" style="mso-layout-grid-align: none; text-align: justify;"><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%; mso-bidi-font-family: TimesNewRomanPSMT;">La modificación anterior se realiza con el fin de que el tipo de una variable este en el subárbol que genera L, de manera que L posea un atributo de tipo sintetizado que almacena el tipo de la variable del identificador generado por L [1], en vez de tener que heredarlo.</span><span style="font-family: "Georgia","serif"; font-size: 12pt; line-height: 115%;"></span></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com1tag:blogger.com,1999:blog-6282817495601970990.post-69269846839588787582011-05-18T08:34:00.000-05:002011-05-18T08:34:08.336-05:00UNIDAD 7: MANEJO DE ERRORES<div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><b style="mso-bidi-font-weight: normal;"><span lang="ES-MX" style="color: red; font-family: "Verdana", "sans-serif"; font-size: 18pt; mso-bidi-font-size: 11.0pt;"></span></b><br />
<b style="mso-bidi-font-weight: normal;"><span lang="ES-MX" style="color: red; font-family: "Verdana", "sans-serif"; font-size: 18pt; mso-bidi-font-size: 11.0pt;"><a name='more'></a>UNIDAD 7 MANEJO DE ERRORES</span></b><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><span lang="ES-GT" style="color: red; font-family: "Verdana", "sans-serif"; font-size: 20pt; mso-ansi-language: ES-GT; mso-bidi-font-size: 11.0pt;">¡¡Los programas no siempre son correctos!!</span><span lang="ES-MX" style="color: red; font-family: "Verdana", "sans-serif"; font-size: 20pt; mso-bidi-font-size: 11.0pt;"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";">Un compilador es un sistema que en la mayoría de los casos tiene que manejar una entrada incorrecta. Sobre todo en las primeras etapas de la creación de un programa, es probable que el compilador se utilizará para efectuar las características que debería proporcionar un buen sistema de edición dirigido por la sintaxis, es decir, para determinar si las variables han sido declaradas antes de usarla, o si faltan corchetes o algo así. Por lo tanto, el manejo de errores es parte importante de un compilador y el escritor del compilador siempre debe tener esto presente durante su diseño.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";"><span style="mso-spacerun: yes;"> </span>Hay que señalar que los posibles errores ya deben estar considerados al diseñar un lenguaje de programación. Por ejemplo, considerar si cada proposición del lenguaje de programación comienza con una palabra clave diferente (excepto la proposición de asignación, por supuesto). Sin embargo, es indispensable lo siguiente:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";">El compilador debe ser capaz de detectar errores en la entrada;</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l6 level1 lfo2; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="font-family: "Georgia", "serif";">El compilador debe recuperarse de los errores sin perder demasiada información;</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l6 level1 lfo2; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="font-family: "Georgia", "serif";">Y sobre todo, el compilador debe producir un mensaje de error que permita al programador encontrar y corregir fácilmente los elementos (sintácticamente) incorrectos de su programa.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div align="right" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: right;"><span style="font-size: large;"><span style="color: blue;"><span lang="ES-MX" style="color: #17365d; font-family: "Georgia", "serif"; mso-bidi-font-size: 11.0pt; mso-themecolor: text2; mso-themeshade: 191;">7.1 Tipos de Errores</span><span lang="ES-MX" style="color: #17365d; font-family: "Georgia", "serif"; mso-themecolor: text2; mso-themeshade: 191;"></span></span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt 108pt; mso-list: l7 level3 lfo1; tab-stops: list 108.0pt; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">¢<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: ES-GT;">Léxicos</span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: EN-US;"> </span><span lang="ES-MX" style="font-family: "Georgia", "serif";"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt 108pt; mso-list: l7 level3 lfo1; tab-stops: list 108.0pt; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">¢<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: ES-GT;">Sintácticos</span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: EN-US;"> </span><span lang="ES-MX" style="font-family: "Georgia", "serif";"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt 108pt; mso-list: l7 level3 lfo1; tab-stops: list 108.0pt; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">¢<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: ES-GT;">Semánticos</span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: EN-US;"> </span><span lang="ES-MX" style="font-family: "Georgia", "serif";"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt 108pt; mso-list: l7 level3 lfo1; tab-stops: list 108.0pt; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">¢<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: ES-GT;">Lógicos</span><span lang="ES-GT" style="font-family: "Georgia", "serif"; mso-ansi-language: EN-US;"> </span><span lang="ES-MX" style="font-family: "Georgia", "serif";"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-size: 11.0pt; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Errores léxicos</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";">Los errores léxicos se detectan cuando el analizador léxico intenta reconocer componentes léxicos en el código fuente.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-size: 11.0pt; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Errores sintácticos</span></span></div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";">Un error de sintaxis se detecta cuando el analizador sintáctico espera un símbolo que no corresponde al que se acaba de leer. Los analizadores sintácticos LL y LR tienen la ventaja de que pueden detectar errores sintácticos lo más pronto posible, es decir, se genera un mensaje de error en cuanto el símbolo analizado no sigue la secuencia de los símbolos analizados hasta ese momento.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-size: 11.0pt; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Error semántico</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif";">Los errores semánticos corresponden a la semántica del lenguaje de programación, la cual normalmente no está descrita por la gramática. Los errores semánticos más comunes son la omisión de declaraciones.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Errores Lógicos</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><b><span lang="ES-MX" style="font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"><span style="mso-spacerun: yes;"> </span></span></b><span lang="ES-MX" style="font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Los comete el programador</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="font-family: "Georgia", "serif"; mso-bidi-font-family: Wingdings;"><span style="mso-spacerun: yes;"> </span></span><span lang="ES-MX" style="font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Ejemplo: una llamada infinitamente recursiva</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: center;"><br />
</div><div align="right" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: right;"><span lang="ES-MX" style="color: #17365d; font-family: "Georgia", "serif"; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 11.0pt; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: blue;"><span style="font-size: large;">7.2 Tratamiento de los errores léxicos</span></span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><b><span lang="ES-MX" style="color: white; font-family: "Century Gothic", "sans-serif"; mso-bidi-font-family: Arial;">TRATAMIENTO DE LOS ERRORES LEXICOS</span></b></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Un traductor debe adoptar alguna estrategia para detectar, informar y recuperarse para seguir analizando hasta el final.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Las respuestas ante el error pueden ser:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l8 level1 lfo3; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Inaceptables: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Provocadas por fallos del traductor, entrada en lazos infinitos, producir resultados erróneos, y detectar sólo el primer error y detenerse.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l8 level1 lfo3; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Aceptables: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Evitarla avalancha de errores (mala recuperación) y, aunque más complejo, informar y reparar el error de forma automática. La conducta de un Analizador de Léxico es el de un Autómata finito o “scanner”.</span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Wingdings;"></span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l8 level1 lfo3; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Detección del error: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">El analizador de Léxico detecta un error cuando no existe transición desde el estado que se encuentra con el símbolo de la entrada. El símbolo en la entrada no es el esperado.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Los errores léxicos se detectan cuando el analizador léxico intenta reconocer componentes léxicos y la cadena de caracteres de la entrada no encaja con ningún patrón. Son situaciones en las que usa un carácter invalido (@,$,",>,...), que no pertenece al vocabulario del lenguaje de programación, al escribir mal un identificador, palabra reservada u operador.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Errores léxicos típicos son:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l3 level1 lfo4; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Nombre ilegales de identificadores: un nombre contiene caracteres inválidos.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l3 level1 lfo4; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Números incorrectos: Un numero contiene caracteres inválidos o no está formado correctamente, por ejemplo 3,14 en vez de 3.14 o 0.3.14.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l3 level1 lfo4; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Errores de ortografía en palabras reservadas: caracteres omitidos, adicionales o cambiados de sitio, por ejemplo la palabra while en vez de hwile.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l3 level1 lfo4; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Fin de archivo: se detecta un fin de archivo a la mitad de un componente léxico. </span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Los errores léxicos se deben a descuidos del programador. En general, la recuperación de errores léxicos es sencilla y siempre se traduce en la generación de un error de sintaxis que será detectado más tarde por el analizador sintáctico cuando el analizador léxico devuelve un componente léxico que el analizador sintáctico no espera en esa posición.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Los métodos de recuperación de errores léxicos se basan bien en saltarse caracteres en la entrada hasta que un patrón se ha podido reconocer; o bien usar otros métodos más sofisticados que incluyen la inserción, borrado, sustitución de un carácter en la entrada o intercambio de dos caracteres consecutivos.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"><span style="mso-spacerun: yes;"> </span>Una buena estrategia para la recuperación de errores léxicos:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: white; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Universidad Nacional del Santa Curso: Teoría de Compiladores</span></div><div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l0 level1 lfo5; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Si en el momento de detectar el error ya hemos pasado por algún estado final ejecutamos la acción correspondiente al último estado final visitado con el lexema formado hasta que salimos de él; el resto de caracteres leídos se devuelven al flujo de entrada y se vuelve al estado inicial;</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l0 level1 lfo5; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Si no hemos pasado por ningún estado final, advertimos que el carácter encontrado no se esperaba, lo eliminamos y proseguimos con el análisis.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><b><span lang="ES-MX" style="color: white; font-family: "Century Gothic", "sans-serif"; mso-bidi-font-family: Arial;">TRATAMIENTO DE LOS ERRORES SINTACTICOS</span></b></div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: right;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-family: Arial; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: blue;"><span style="font-size: large;">7.3 Tratamiento de errores sintácticos</span></span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Muchos errores de naturaleza sintáctica Recuperación: Al producirse un error el compilador debe ser capaz de informar del error y seguir compilando. (Ideal)</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">El manejo de errores de sintaxis es el más complicado desde el punto de vista de la creación de compiladores. Nos interesa que cuando el compilador encuentre un error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador sintáctico debe tener como objetivos:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l5 level1 lfo6; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localización.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l5 level1 lfo6; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Recuperarse del error, para poder seguir examinando la entrada.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l5 level1 lfo6; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">No ralentizar significativamente la compilación.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Un buen compilador debe hacerse siempre teniendo también en mente los errores que se <span style="mso-spacerun: yes;"> </span>pueden producir; con ello se consigue:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l1 level1 lfo7; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Simplificar la estructura del compilador.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l1 level1 lfo7; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Mejorar la respuesta ante los errores.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Tenemos varias estrategias para corregir errores, una vez detectados:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"></span><span style="font-family: Verdana, sans-serif;"><span style="color: lime;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"></span></span></span><span lang="ES-MX" style="color: black; font-family: "Century Gothic", "sans-serif"; mso-bidi-font-family: Verdana;"></span><br />
<div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: lime;"><span lang="ES-MX" style="color: #00b050; font-family: "Verdana", "sans-serif"; font-size: 12pt; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold;">Ignorar el problema (Panicmode)</span><span lang="ES-MX" style="color: #00b050; font-family: "Verdana", "sans-serif"; mso-bidi-font-family: Verdana; mso-bidi-font-weight: bold;"></span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Consiste en ignorar el resto de la entrada hasta llegar a una condición de seguridad.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Una condición tal se produce cuando nos encontramos un token especial (por ejemplo un ‘;’ o un ‘END’). A partir de este punto se sigue analizando normalmente.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; font-size: 12pt; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Recuperación a nivel de frase</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Intenta recuperar el error una vez descubierto. En el caso anterior, por ejemplo, podría haber sido lo suficientemente inteligente como para insertar el token ‘;’. Hay que tener cuidado con este método, pues puede dar lugar a recuperaciones infinitas.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; font-size: 12pt; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Reglas de producción adicionales para el control de errores</span></span></div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">La gramática se puede aumentar con las reglas que reconocen los errores más comunes. En el caso anterior, se podría haber puesto algo como:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">sent_erróne a Ú sent_sin_acabar sentencia_acabada ’;’</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">sentencia_acabada Ú sentencia ‘;’</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">sent_sin_acabar Ú sentencia</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Lo cual nos da mayor control en ciertas circunstancias</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="center" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: center;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="ES-MX" style="color: #17365d; font-family: "Verdana", "sans-serif"; font-size: 12pt; mso-bidi-font-family: Verdana; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="color: lime;">Corrección Global</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Dada una secuencia completa de tokens a ser reconocida, si hay algún error por el que no se puede reconocer, consiste en encontrar la secuencia completa más</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">parecida que sí se pueda reconocer. Es decir, el analizador sintáctico le pide toda la secuencia de tokens al léxico, y lo que hace es devolver lo más parecido a la cadena de entrada pero sin errores, así como el árbol que lo reconoce.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div align="right" class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: right;"><span lang="ES-MX" style="color: #17365d; font-family: "Georgia", "serif"; mso-bidi-font-family: Arial; mso-bidi-font-size: 11.0pt; mso-bidi-font-weight: bold; mso-themecolor: text2; mso-themeshade: 191;"><span style="font-family: Georgia, "Times New Roman", serif;"><span style="color: blue;"><span style="font-size: large;">7.4 Tratamiento errores semánticos</span></span></span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Verdana", "sans-serif"; mso-bidi-font-family: Verdana;"><span style="color: lime; font-family: Verdana, sans-serif;">Comprobacion de tipos</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"><span style="color: lime;">Aspectos generales</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Un lenguaje con comprobación fuerte de tipos es capaz de garantizar que los programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se detectarán siempre en tiempo de compilación. </span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Como mínimo, ante un error, un comprobador de tipos debe informar de la naturaleza y posición del error y recuperarse para continuar con la comprobación del resto del programa a analizar.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Veamos algunas de las operaciones a tener en cuenta en una comprobación de tipos:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l2 level1 lfo8; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Conversión de tipos: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">A veces es necesario transformar el tipo de una expresión para utilizar correctamente un operador o para pasar de forma adecuada un parámetro a una función.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l2 level1 lfo8; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Coerción: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Es una conversión de tipos que realiza de forma implícita el propio compilador. Si es el programador el que realiza la conversión se tratará entonces de una conversión explícita.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l2 level1 lfo8; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Sobrecarga de operadores: </span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">La sobrecarga se resuelve determinando el tipo de cada una de las expresiones intervinientes en la sobrecarga.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l2 level1 lfo8; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><b style="mso-bidi-font-weight: normal;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Funciones polimórficas:</span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"> Son aquellas que trabajan con argumentos cuyo tipo puede cambiaren distintas llamadas a la función.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"><span style="color: lime;">Especificación de un comprobador de tipos básico</span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Básicamente se deberán realizar dos tareas:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l9 level1 lfo9; text-align: justify; text-indent: -18pt;"><b style="mso-bidi-font-weight: normal;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Georgia; mso-fareast-font-family: Georgia;"><span style="mso-list: Ignore;">a)<span style="font-family: "Times New Roman";"> </span></span></span></b><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Asignación de tipos</span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">: en las declaraciones.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l9 level1 lfo9; text-align: justify; text-indent: -18pt;"><b style="mso-bidi-font-weight: normal;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Georgia; mso-fareast-font-family: Georgia;"><span style="mso-list: Ignore;">b)<span style="font-family: "Times New Roman";"> </span></span></span></b><b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Evaluación y comprobación de tipos</span></b><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">: En las expresiones y en las funciones, así como en las sentencias.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
<span style="color: lime;"><span style="font-family: Verdana, sans-serif;">Otras comprobaciones semánticas y recuperación de errores semánticos </span></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Dentro de las comprobaciones estáticas (en el momento de la compilación), tenemos la detección e información de errores como:</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l4 level1 lfo10; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Comprobaciones de tipos: operadores aplicados a operandos incompatibles, asignación de tipos incompatibles, llamadas a funciones con tipos no adecuados, etc.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l4 level1 lfo10; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Comprobaciones de flujo de control: las sentencias que hacen que el flujo de control abandone una construcción debe tener alg ´un lugar a donde transmitir el control. Por ejemplo: Unbreak debe estar dentro de una proposición while,<span style="mso-spacerun: yes;"> </span>for o switch en C.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-layout-grid-align: none; mso-list: l4 level1 lfo10; text-align: justify; text-indent: -18pt;"><span lang="ES-MX" style="color: black; font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-family: "Times New Roman";"> </span></span></span><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Comprobaciones de unicidad: situaciones en las que solo se puede definir un objeto una vez exactamente. Por ejemplo: Un identificador, las etiquetas case dentro de un switch.</span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><span lang="ES-MX" style="color: black; font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;">Solo nos hemos centrado en las comprobaciones de tipo. Las otras son e<span style="mso-spacerun: yes;"> </span>cierto modo rutinarias y se pueden realizar fácilmente insertando acciones intercaladas en el código para realizarlas, por eje. Cuando se introduce un identificador en la Tabla de Símbolos.</span><span lang="ES-MX" style="font-family: "Georgia", "serif"; mso-bidi-font-family: Verdana;"></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none; text-align: justify;"><br />
</div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com1tag:blogger.com,1999:blog-6282817495601970990.post-14770654862974273532011-05-18T08:33:00.001-05:002011-05-18T22:48:53.864-05:00UNIDAD 8 GENERACION DE CODIGO INTERMEDIO<div style="text-align: center;"><span style="font-size: x-large;"><b style="color: red;"><span style="font-family: Verdana,sans-serif;"></span></b></span><br />
<span style="font-size: x-large;"><b style="color: red;"><span style="font-family: Verdana,sans-serif;"></span></b></span><br />
<a name='more'></a><span style="font-size: x-large;"><b style="color: red;"><span style="font-family: Verdana,sans-serif;">GENERACIÓN DE CÓDIGO INTERMEDIO</span></b></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><div style="color: blue; text-align: right;"><b><span style="font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;">INTRODUCCION</span></span></b></div><div style="color: blue; text-align: right;"></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Esta fase del compilador no es en realidad una parte separada del compilador, la mayoría</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">de los compiladores generan código como parte del proceso de análisis sintáctico, esto es</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">debido a que requieren del árbol de sintaxis y si este no va a ser construido físicamente,</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">entonces deberá acompañar al analizador sintáctico al barrer el árbol implícito. En lugar</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">de generar código ensamblador directamente, los compiladores generan un código</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">intermedio que es más parecido al código ensamblador, las operaciones por ejemplo</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">nunca se hacen con más de dos operandos. Al no generarse código ensamblador el cual</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">es dependiente de la computadora especifica, sino código intermedio, se puede reutilizar</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">la parte del compilador que genera código intermedio en otro compilador para una</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">computadora con diferente procesador cambiando solamente el generador de código</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">ensamblador al cual llamamos back-end, la desventaja obviamente es la lentitud que esto</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">conlleva.</span></span></div><div style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">La tarea de síntesis suele comenzar generando un código intermedio. El código</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">intermedio no es el lenguaje de programación de ninguna máquina real, sino que</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">corresponde a una máquina abstracta, que se debe de definir lo más general posible, de</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">forma que sea posible traducir este código intermedio a cualquier máquina real.</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">El objetivo del código intermedio es reducir el número de programas necesarios para</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">construir traductores, y permitir más fácilmente la transportabilidad de unas</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">máquinas a otras. Supóngase que se tienen n lenguajes, y se desea construir</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">traductores entre ellos. Sería necesario construir n*(n-1) traductores.</span></span></div><div style="text-align: justify;"><br />
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Sin embargo si se construye un lenguaje intermedio, tan sólo son necesarios 2*n</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">traductores.</span></span><br />
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Así por ejemplo un fabricante de compiladores puede construir un compilador para</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">diferentes máquinas objeto con tan sólo cambiar las dos últimas fases de la tarea de</span></span> <span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">síntesis.</span></span></div><div style="text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjx0E7PUhVhozIe4B0IEOEYFbgPAaJm_9ea48dUuAaGMt4HVfIuvegTS0DtavJIpO_OOebwIPlXfmDhh10GN37EkH9CvdGIj4z43gkxxMZcR7fUxdn9K3ZxHnsmWavwHb8epQ6vLVh7wC8/s1600/Imagen1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="99" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjx0E7PUhVhozIe4B0IEOEYFbgPAaJm_9ea48dUuAaGMt4HVfIuvegTS0DtavJIpO_OOebwIPlXfmDhh10GN37EkH9CvdGIj4z43gkxxMZcR7fUxdn9K3ZxHnsmWavwHb8epQ6vLVh7wC8/s640/Imagen1.png" width="640" /> </a></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black;">Aunque un programa fuente se puede traducir directa mente al lenguaje objeto, algunas ventajas de utilizar una forma intermedia independiente de la máquina son:</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;"> Se facilita la </span><u><span style="color: black;">redestinación</span></u><span style="color: black;">; se puede crear un compilador para una máquina distinta uniendo una etapa final para la nueva máquina a una etapa inicial ya existente.</span><span style="color: black;"> </span></span></div><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> </span><br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black;"> Se puede aplicar a la representación intermedia un </span><span style="color: black;">optimizador</span><span style="color: black;"> de código independiente de la máquina.</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black;"> </span></span> <br />
<div style="color: blue; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 14.4pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: large;"><u><span style="font-weight: bold;">Lenguajes intermedios</span></u></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Los árboles sintácticos y la notación postfija son dos clases de representaciones intermedias. </span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">El código intermedio es un código abstracto independiente de la máquina para la que se generará el código objeto. El código intermedio ha de cumplir dos requisitos importantes: ser fácil de producir a partir del análisis sintáctico, y ser fácil de traducir al lenguaje objeto. </span></span></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><b><span style="font-size: large;"><span style="color: black;"><span style="color: blue;">Control de flujo</span></span></span></b></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"><span style="color: black; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">En los lenguajes de programación hay estructuras y operadores que permiten controlar el flujo de la ejecución, estos pueden ser ciclos, saltos, condiciones entre otros.</span></span></span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="color: #274e13; font-family: Verdana,sans-serif; font-size: small;"><span style="font-weight: bold;">Expresiones booleanas</span></span><u style="text-underline: single;"><span style="color: #990000; font-family: Papyrus; font-size: 20pt; font-weight: bold;"> </span></u></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">En los lenguajes de programación, las expresiones booleanas tienen dos propósitos principales. Se utilizan para calcular valores lógicos </span></span><span style="font-size: small;"><span style="color: black;">y</span><span style="color: black;"> como expresiones condicionales en proposiciones que alteran el flujo del control, como las proposiciones </span><span style="color: black; font-weight: bold;">if-else</span><span style="color: black; font-weight: bold;"> </span><span style="color: black;">o </span><span style="color: black;"> </span><span style="color: black; font-weight: bold;">do-</span><span style="color: black; font-weight: bold;">while</span><span style="color: black; font-weight: bold;">.</span><span style="color: black;"> </span></span></div><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> </span><br />
<div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black;">Las expresiones booleanas se componen de los operadores </span><span style="color: black;">boleanos</span><span style="color: black;"> (</span><span style="color: black; font-weight: bold;">and, </span><span style="color: black; font-weight: bold;">or</span><span style="color: black; font-weight: bold;"> </span><span style="color: black;">y </span><span style="color: black; font-weight: bold;">not</span><span style="color: black;">) aplicados a los elementos que son variables booleanas o expresiones relacionales. Algunos lenguajes permiten expresiones más generales donde se pueden aplicar operadores </span><span style="color: black;">booleanos</span><span style="color: black;">, aritméticos y relacionales a expresiones de cualquier tipo, sin diferenciar valores </span><span style="color: black;">booleanos</span></span><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> de aritméticos; si es necesario se realiza una coerción.</span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> </span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> <b style="font-family: Verdana,sans-serif;"><span style="color: #274e13;">Saltos</span></b></span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">En el código de los saltos los operadores lógicos &&, || y ! son traducidos a saltos aunque estos no aparecen realmente en el código. Por ejemplo la expresión: if (x < 100 || x > 200 && x!= y ) x=0; se puede traducir como las siguientes instrucciones:</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />
If x < 100 goto L2<br />
If False x > 200 goto L1<br />
If False x != y goto L1<br />
L2: x =0<br />
L1:</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Si la expresión es verdadera se alcanza la etiqueta L2 y se realiza la asignación en caso contrario no haría nada.</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><b><span style="color: blue; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;">Backpatching</span></span></b></span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Cuando se genera un código con saltos condicionales y expresiones booleanas se enfrenta un problema muy común, en la expresión if (B) S debemos establecer el salto hacia S cuando se da B, el problema es que no siempre se conoce B a la hora de hacer esta transformación.<br />
</span></span></span></span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Backpatching es un enfoque donde al momento de generar un salto el objetivo de este salto se deja temporalmente indefinido. Cada salto es almacenado en una lista de saltos donde las etiquetas de sus destinos son establecidas en el momento en que ya pueden ser determinadas.<br />
</span></span></span></span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">La manipulación de la lista de etiquetas se realiza con los métodos:</span></span></span></span></span></div><ul><li><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"> makelist(i) crea una nueva lista que contiene solo a i,un índice en el vector de instrucciones y además el método makelist retorna un puntero a la lista creada.</span></span></span></span></span></li>
<li><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"> merge(pl , p2 ) concatena las listas apuntadas por pl y p2 , y retorna el puntero a la nueva lista.</span></span></span></span></span></li>
<li><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"> backpatch(p, i) inseta i como la etiqueta objetivo para cada instruccion en la lista apuntada por p.</span></span></span></span></span></li>
<li><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"> </span></span></span><b><span style="color: blue; font-size: large;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></b></span></span></li>
</ul><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><br />
<span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"></span></span> </div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 14.4pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: large;"><u style="color: blue;"><span style="font-weight: bold;">Expresiones</span></u></span><u style="text-underline: single;"><span style="color: #990000; font-family: Papyrus; font-size: 24pt; font-weight: bold;"> </span></u></div><div></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">Pueden ser de tipo entero, real, matriz , registros. </span><span style="color: black;">En la Tabla de Símbolos se puede buscar los nombres de las expresiones y se puede acceder a los elementos de matrices y registros. </span><span style="color: black;"> </span></span></div><div style="font-family: Georgia,"Times New Roman",serif; text-align: justify;"></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="color: black;">E</span><span style="color: black;">stos</span><span style="color: black;"> nombres representan a las expresiones dentro de la Tabla de Símbolos.</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 14.4pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: large;"><u style="color: blue;"><span style="font-weight: bold;">Tipos y Declaraciones</span></u></span><u style="text-underline: single;"><span style="color: #990000; font-family: Papyrus; font-size: 24pt; font-weight: bold;"> </span></u></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">Conforme se examina la secuencia de declaraciones dentro de un procedimiento o un bloque, se puede distribuir la memoria para los nombres locales al procedimiento. Para cada nombre local se crea una entrada en la </span><u><span style="color: black;">tabla de símbolos</span></u><span style="color: black;"> con información, por ejemplo, referente al tipo y la dirección relativa de la memoria correspondiente al nombre.</span><span style="color: black;"> </span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; language: es-MX; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; text-justify: inter-ideograph; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">La sintaxis de lenguajes como C, Pascal y FORTRAN permite que todas las declaraciones en un solo procedimiento se procesen como un grupo. </span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Las expresiones de tipo son las estructuras de tipos que definen un programa, pueden ser de tipos básicos (booleano, char, integer, float, void) o formados por una estructura de tipos básicos creada por operadores de constructores de tipo.<br />
</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Una forma conveniente de representar una expresión de tipo es usando un grafo. Los nodos interiores se usaran para constructores de tipo y las hojas se usaran para los tipos básico. Cuando las expresiones de tipos están representadas por grafos se pueden comparar para ver si son de tipos equivalentes. Dos tipos son estructuralmente equivalentes si: </span></span></div><ul><li><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> Son el mismo tipo básico</span></span><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> </span></span></li>
<li><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> Son formados utilizando el mismo constructor con los mismos tipos básicos</span></span> </li>
<li> Uno es un tipo que denota otro</li>
</ul><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Dado un tipo de una variable, se puede calcular la cantidad de almacenamiento que se necesitara para la variable en tiempo de ejecución. El tipo y la dirección relativa se guardaran en la tabla de símbolos para cada variable. Para los tipos de dimensión variable, tales como hileras de caracteres o vectores dinámicos, se les asignara una cantidad de almacenamiento para un puntero al tipo.<br />
</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Parte importante de la generación de código de un compilador es la verificación de tipos. Se debe verificar que el programa siga las reglas de tipos especificados por el programa, una implementación que se base en estas reglas encontrará errores en las modificaciones al compilar. </span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><b><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"><span style="color: blue; font-size: large;">Verificación de tipos</span></span></span></b></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"><span style="color: blue; font-size: large;"> </span>La verificación de tipos es una técnica utilizada para asegurar que un programa obedece las reglas de compatibilidad específicas del lenguaje de programación utilizado. La verificación se puede realizar de dos formas: en tiempo de ejecución o de manera estática.<br />
</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Para que un compilador pueda realizar el chequeo se debe asignar una expresión de tipo que<br />
identifique cada componente del lenguaje fuente. Con estas definiciones de tipos se pueden formular reglas lógicas que son llamadas: sistema de tipos, el cuál define como un lenguaje de programación clasifica sus elementos en tipos y determina reglas de relación y comportamiento entre estos tipos. Una violación a alguna regla es llamada choque de tipos.</span></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"> <b>Tipos de chequeo</b></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><b style="color: black; font-family: Georgia,"Times New Roman",serif;"> </b><span style="color: black; font-family: Georgia,"Times New Roman",serif;">La verificación de datos se puede realizar de dos maneras: por medio de síntesis y con el método </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">de la inferencia.</span><br style="color: black; font-family: Georgia,"Times New Roman",serif;" /><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> </span></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">El método de la síntesis consiste en derivar el tipo de una expresión basándose en los tipos de sus </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">subexpresiones. En la síntesis se requiere que los tipos estén declarados antes de ser utilizados y deben </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">poseer un nombre que los identifique.</span><br style="color: black; font-family: Georgia,"Times New Roman",serif;" /><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> </span></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">La inferencia de tipos se basa en determinar el tipo de una expresión o elemento según la manera </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">en que sea utilizado, es decir si tenemos una función f(x) donde se supone que x sea de un tipo Y, </span><b><span style="color: black; font-family: Georgia,"Times New Roman",serif;">tendremos que cada vez que se aplique F () sobre algún elemento este elemento será de tipo Y.</span></b></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><b><span style="color: #274e13; font-family: Verdana,sans-serif;">Conversión de tipos </span> </b></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><b> </b></span></div><div style="color: black; direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;">Algunos tipos diferentes de datos son tratados de forma diferente por el computador, sin embargo es necesario poder operar entre ellos, por lo que los lenguajes de programación implementan la conversión de tipos, que se basa en cambiar el tipo de una expresión por otro.<br />
</span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Por ejemplo si deseamos multiplicar un numero entero y uno flotante, el compilador debe unificar </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">los tipos ya que el almacenamiento y manejo de la maquina es diferente para estos 2 tipos. Lo que el </span><span style="color: black; font-family: Georgia,"Times New Roman",serif;">compilador hacer es convertir el entero a flotante.</span></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><b><span style="font-size: small;">Sobrecarga de funciones y operadores</span></b></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;">La sobrecarga de operadores es utilizada cuando necesitamos realizar varias funciones con el mismo símbolo o función. El operador se trata dependiendo del contexto donde se encuentre.<br />
</span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;">Por ejemplo el operador “+” en Java puede ser utilizado para concatenar una hilera o para sumar numerales. “Las funciones definidas por el usuario se pueden sobrecargar como se muestra a continuación:<br />
</span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;"> void err () {…}<br />
void err(String s) {…}<br />
</span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;">La escogencia de una de estas dos funciones se realiza tomando en cuenta su número y tipo de<br />
argumentos.”.<br />
<b style="color: #274e13;"><br style="font-family: Verdana,sans-serif;" /></b></span></div><div style="text-align: right;"><div style="text-align: right;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;"><b style="color: #274e13;"><span style="font-family: Verdana,sans-serif;">Funciones polimórficas</span></b></span></div><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;"></span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;">Las funciones normales permiten ser ejecutadas con argumentos de tipos fijos, una función polimórfica acepta parámetros de tipos variables. El término polimórfico aplica también a operadores.</span></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="color: black; font-family: Georgia,"Times New Roman",serif; font-size: small;">Las funciones polimórficas son muy útiles ya que permite crear algoritmos independientes del tipo de operadores.</span><b><span style="font-size: small;"> </span></b></div><div style="color: #274e13; direction: ltr; font-family: Verdana,sans-serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> </span><b><br />
</b></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"></div><div style="direction: ltr; line-height: 110%; margin-bottom: 0pt; margin-top: 12pt; text-align: right; unicode-bidi: embed; vertical-align: baseline;"><b><span style="font-family: Georgia,"Times New Roman",serif; font-size: large;"><span style="color: blue;">Llamadas a funciones/procedimiento</span></span><span style="font-size: large;"><u style="color: blue; font-family: Georgia,"Times New Roman",serif;"><span style="font-weight: bold;">s</span></u></span></b><u style="text-underline: single;"><span style="color: #990000; font-family: Papyrus; font-size: 20pt; font-weight: bold;"> </span></u></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 110%; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">E</span><span style="color: black;">s fundamental que un compilador genere buen código para llamadas y retornos de </span><span style="color: black;">funciones</span><span style="color: black;">. La traducción de una llamada incluye una secuencia de llamada, que es una secuencia de acciones que se toman a la entrada y a la salida de cada </span><span style="color: black;">función/</span><span style="color: black;">procedimiento. </span><span style="color: black;"> </span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; line-height: 110%; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">Aunque las secuencias de llamada difieren, incluso en aplicaciones del mismo lenguaje, habitualmente tienen lugar las siguientes acciones:</span><span style="color: black;"> </span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; language: es-MX; line-height: 110%; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; text-justify: inter-ideograph; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;">Cuando ocurre la llamada a un función, se debe asignar espacio para el registro de activación del procedimiento llamado. Los argumentos de la función llamada se deben evaluar y poner a disposición de la función llamada en un lugar conocido. Se deben establecer los apuntadores de ambiente para permitir que la función llamada tenga acceso a los datos de las funciones abarcadoras</span></span><span style="color: black; font-family: Papyrus; font-size: 20pt;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">.</span></span> </span></div><div style="direction: ltr; line-height: 110%; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;"></span><span style="color: black;">Se debe guardar el estado </span><span style="color: black;">de la función </span><span style="color: black;">que efectúa la llamada para que pueda reanudar la ejecución después de la llamada. También se guarda en un lugar conocido la dirección de retorno, que es la posición a la que la rutina llamada debe transferir el control cuando finalice. La dirección de retorno normalmente es la posición de la instrucción que sigue la llamada en </span><span style="color: black;">la función </span><span style="color: black;">autor </span><span style="color: black;">de la llamada. Por último, se debe generar un salto al principio del código </span><span style="color: black;">la función llamada.</span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;"> </span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black;">No existe una división exacta de las tareas en el momento de la ejecución entre </span><span style="color: black;">la función </span><span style="color: black;">que hace la llamada y </span><span style="color: black;">la función </span><span style="color: black;">que recibe la llamada. </span><span style="color: black;"> </span></span></div><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span><br />
<div style="direction: ltr; language: es-MX; margin-bottom: 0pt; margin-top: 12pt; text-align: justify; text-justify: inter-ideograph; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="color: black; font-family: Georgia,"Times New Roman",serif;"> A menudo, el lenguaje fuente, la máquina objeto y el sistema operativo imponen requisitos que favorecen una solución sobre otra.</span></span></div></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: right; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><b><span style="color: blue; font-family: Georgia,"Times New Roman",serif; font-size: large;">Código de Tres Direcciones</span></b></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;">Es una manera linear de representar un grafo de subexpresiones en donde los nombres explícitos<br />
corresponden a los nodos interiores del grafo (figura 3), muy útil principalmente a la hora de optimizar. Las instrucciones se representan utilizando cuando mucho un solo operador en la parte derecha de la expresión, es decir, una expresión del tipo "x+y*z" se representaría de la manera "t1=y*z y t2=x+t1".</span></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;">El código de tres direcciones se basa en 2 conceptos principalmente en 2 conceptos: direcciones e<br />
instrucciones.</span></div><ul><li><span style="font-size: small;">Nombres: los nombres que se usan en el programa puede aparecer también en el código de 3 direcciones, aunque a la hora de implementar se usara un puntero o su entrada en la tabla de símbolos.</span></li>
<li><span style="font-size: small;">Una constante: el compilador tiene que poder interactuar con muchos tipos de constantes.</span></li>
</ul><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;">Las instrucciones más básicas pueden definirse de la siguiente manera:</span></div><ul><li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">x=y'op'z, donde 'op' es un operador binario aritmético o una expresión lógica.</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> x='op'y, donde 'op' es una operación unaria.</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">x=y, donde a x se le asigna el valor de y</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">goto L, la instrucción con la etiqueta L se ejecutara.</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">if x goto L o if false goto L, se ejecutaría la instrucción con la etiqueta L dependiendo de si x es verdadero o falso.</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">if x relop y goto L, se ejecutaría la instrucción L dependiendo del operador relacional que se le aplique a x y y</span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">param x y call p,n, donde param x indica que x es un parámetro. call llama un procedimiento p con un número de parámetros n.</span></li>
</ul><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> En el diseño del código intermedio, es necesario escoger un buen conjunto de operadores. Se<br />
Usando el código de 3 direcciones, el compilador puede representar código intermedio y ayudarse en la implementación mas optima del código final.<br />
</span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Las direcciones se pueden definir como: deben tener los suficientes operadores para satisfacer las instrucciones del lenguaje, y que a su vez sean cercanos al lenguaje de maquina. Sin embargo, si se crean demasiadas instrucciones, el optimizados y el generador de código tendrán que trabajar mas para generar el código final.<br />
</span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Una proposición de código de 3-direcciones se puede implantar como una estructura tipo registro con campos para el operador, los operandos y el resultado. La representación final será entonces una lista enlazada o un vector de proposiciones. Hay dos formas principales de implementar el código de tres direcciones:</span></div><div style="direction: ltr; font-family: Georgia,"Times New Roman",serif; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: right; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><b><span style="color: #274e13;">Cuadruplas</span></b></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Una cuadrupla es una estructura tipo registro con cuatro campos que se llaman (op, result, arg1, arg2). </span><span style="font-family: Georgia,"Times New Roman",serif;">El campo op contiene un código interno para el operador.</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"></span><span style="font-family: Georgia,"Times New Roman",serif;">Por ejemplo, la proposición de tres direcciones x = y + z se podría representar mediante la </span><span style="font-family: Georgia,"Times New Roman",serif;">cuadrupla (ADD, x,y, z). Las proposiciones con operadores unarios no usan el arg2. Los campos que no se </span><span style="font-family: Georgia,"Times New Roman",serif;">usan se dejan vacíos o un valor NULL. Como se necesitan cuatro campos se le llama representación </span><span style="font-family: Georgia,"Times New Roman",serif;">mediante cuadruplas.</span></span></div><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0.5in; margin-top: 12pt; text-align: justify; text-indent: -0.5in; unicode-bidi: embed; vertical-align: baseline;"><br />
<div style="text-align: right;"><b><span style="color: #274e13; font-family: Verdana,sans-serif; font-size: small;">Tripletas</span></b></div><div style="text-align: right;"></div><div style="text-align: justify;"><span style="color: black; font-family: Verdana,sans-serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Para evitar tener que introducir nombres temporales en la tabla de símbolos, se hace referencia a </span><span style="font-family: Georgia,"Times New Roman",serif;">un valor temporal según la posición de la proposición que lo calcula. Las propias instrucciones representan </span><span style="font-family: Georgia,"Times New Roman",serif;">el valor del nombre temporal. La implementación se hace mediante registros de solo tres campos (op, arg1, </span><span style="font-family: Georgia,"Times New Roman",serif;">arg2).</span><br style="font-family: Georgia,"Times New Roman",serif;" /><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></div><div style="text-align: justify;"><span style="color: black; font-family: Verdana,sans-serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">En la notación de tripletes se necesita menor espacio y el compilador no necesita generar los</span><br style="font-family: Georgia,"Times New Roman",serif;" /><span style="font-family: Georgia,"Times New Roman",serif;">nombres temporales. Sin embargo, en esta notación, trasladar una proposición que defina un valor temporal </span><span style="font-family: Georgia,"Times New Roman",serif;">exige que se modifiquen todas las referencias a esa proposición. Lo cual supone un inconveniente a la hora </span><span style="font-family: Georgia,"Times New Roman",serif;">de optimizar el código, pues a menudo es necesario cambiar proposiciones de lugar.</span><br style="font-family: Georgia,"Times New Roman",serif;" /><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></div><div style="text-align: justify;"><span style="color: black; font-family: Verdana,sans-serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Una forma de solucionar esto consiste en listar las posiciones a las tripletas en lugar de listar las </span><span style="font-family: Georgia,"Times New Roman",serif;">tripletas mismas. De esta manera, un optimizador podría mover una instrucción reordenando la lista, sin </span><span style="font-family: Georgia,"Times New Roman",serif;">tener que mover las tripletas en si.</span></span><b><span style="color: #274e13; font-family: Verdana,sans-serif; font-size: small;"> </span></b></div><div style="text-align: justify;"><b><span style="color: #274e13; font-family: Verdana,sans-serif; font-size: small;"><br />
</span></b></div><div style="text-align: justify;"><b><span style="color: #274e13; font-family: Verdana,sans-serif; font-size: small;"><br />
</span></b></div></div>7mo 1http://www.blogger.com/profile/05080004748615496344noreply@blogger.com1